numdiff-5.9.0/0000755000175000017500000000000013054341114012475 5ustar paologpaolognumdiff-5.9.0/linesplit.h0000444000175000017500000000300313054341114014643 0ustar paologpaolog/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #define I_DEF_SEP ' ' #define DEF_IFS "\\s \\t \\n" #define NEWLINE_STR "\n" char** ssplit (const char* str, char separator); char** ssplit_former_way (const char* str); void print_string_vector (FILE* fp, const char** sv, char separator); void sort_string_vector (char** sv); void remove_duplicates_from_string_vector (char** sv); int is_string_in_vector (const char* str, const char** sv); size_t is_char_in_vector (int ch, const char** sv); void delete_string_vector (char** sv); char* get_separating_string (const char* istr); char* string_cspn (const char* str, const char** svi, int eos); char* string_spn (const char* str, const char** svi, int eos); numdiff-5.9.0/INSTALL0000644000175000017500000003506713054341114013541 0ustar paologpaolog Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. *********************************************************************************** How to build and install Numdiff ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To successfully compile, build and install Numdiff some tools are required. The first one is an ANSI C compiler. This compiler should at least accept the option `-o' to write its output to a specified file, the option `-D' for macros pre-definition, the option `-l' to search for a specified library, and the options `-I' and `-L' to add a given directory to the search path for include and library files respectively. In addition, you need a POSIX implementation of the `make' utility (I used both GNU make and smake by Joerg Schilling to compile Numdiff) and a POSIX implementation of the commands `rm' and `find'. At last, you need a proper installation of GNU Texinfo (in order to install the info documentation) and a shell sh-compatible. Numdiff has been successfully compiled and tested on: - Slackware(R) GNU/Linux 10.2 with the version 3.3.6 of the GNU C Compiler (GCC), - Slackware GNU/Linux 11 with GCC 3.4.6, - Slackware GNU/Linux 12.2 with GCC 4.2.4, - Slackware GNU/Linux 13 with GCC 4.3.3, - Debian(R) GNU/Linux 4.0 with GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21), - Debian GNU/Linux 6.0.3 with GCC 4.4.5 (Debian 4.4.5-8), - Debian GNU/Linux 7.1 with GCC 4.7.2 (Debian 4.7.2-5), - Debian GNU/Linux 8.6 with GCC 4.9.2 (Debian 4.9.2-10), - SunOS(R) 5.8 with GCC 2.95.3, and - SunOS 5.10 (i386) with the version 5.9 of the Sun C compiler. Configuration, building and installation of Numdiff can be performed through the standard three steps: ./configure make make install If you leave enabled the Natural Language Support and you also want to install the localization files (at the moment only the Italian localization is supplied), then after `make' you will have to type and run make install-nls By default, `make install' will install all the files in `/usr/local/bin', `/usr/local/info' etc. You can specify an installation prefix other than `/usr/local' using the option `--prefix' in the `configure' step, for instance `--prefix=$HOME': ./configure --prefix=$HOME For better control, you can use the options `--bindir', `--infodir', and so on. Type `./configure --help' to obtain the complete list of all available options. The documentation files (including a full User Manual available in HTML, PDF and plain ASCII text format) will always be put in `DOCDIR/numdiff', where `DOCDIR' is the path specified by the option `--docdir' or, if this option has not been given to `configure', `PREFIX/share/doc'. Here `PREFIX' is the installation prefix specified by the option `--prefix' or the default `/usr/local'. Once Numdiff has been installed you can remove all files related to Numdiff by a simple `make uninstall'. If you have also installed the localization files trough `make install-nls', use `make uninstall-nls' in place of `make uninstall' to remove them too. Between the options accepted by `configure' there are `--enable-debug', `--enable-optimization', `--enable-nls' and `--enable-gmp'. The option `--enable-debug' turns on debugging when compiling the source code. This is obtained by passing to the compiler the `-g' option, but you can change this default debugging flag (which could not even be recognized by your compiler) by setting the environment variable `DBGFLAGS' before calling `configure'. The option `--enable-optimization' turns on basic optimization when compiling the source code. This is obtained by passing to the compiler the `-O' option, but you can change this default flag (which could not even be recognized by your compiler) by setting the environment variable `OPTFLAGS' before calling `configure'. The option `--enable-nls' turns on Natural Language Support. You do not need to use it explicitly since Natural Language Support is enabled by default. To disable it, use `--disable-nls'. Disabling Natural Language Support is suggested whenever you want to install Numdiff on a system where the GNU gettext library is not present. In this case the installation of Numdiff can be accomplished, for example, through ./configure --disable-nls make make install Since version 5.2.0 Numdiff uses to perform all computations the GNU Multiple Precision Arithmetic Library (also called GNU MP or GMP), if this library is available at build-time. The old internal support for multiple precision arithmetic is a fall-back in case GNU MP is absent. However, it is possible to use the internal support for multiple precision arithmetic even when GNU MP is available: it is sufficient to pass the option `--enable-gmp=no' or `--disable-gmp' to the configure script before building the program, like in ./configure --disable-gmp make make install Enabling the old internal support for multiple precision arithmetic is deprecated, I suggest to always link Numdiff against GNU MP. The latest version of GNU MP is available at http://ftp.gnu.org/gnu/gmp/. See the GNU MP web page at http://gmplib.org/ for up-to-date information on GNU MP. Below, I have attached the generic INSTALL instructions included in the autoconf distribution. ---------------------------------------------------------------------------- Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. numdiff-5.9.0/linesplit.c0000444000175000017500000003760613054341114014656 0ustar paologpaolog/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include"linesplit.h" #define O_DEF_SEP '\n' #define ESC_CHAR '\\' const unsigned char InvDigit = (unsigned char) -1; static unsigned char is_hex_digit (char ch) { if (ch >= '0' && ch <= '9') return ch - '0'; else { switch (ch) { case 'a': case 'A': return 10; case 'b': case 'B': return 11; case 'c': case 'C': return 12; case 'd': case 'D': return 13; case 'e': case 'E': return 14; case 'f': case 'F': return 15; default: return InvDigit; } } } static unsigned char is_oct_digit (char ch) { if (ch >= '0' && ch <= '7') return ch - '0'; else return InvDigit; } static int is_hex (const char* pafter_escape, char* byte) { unsigned char hb, lb; /* The return value is the number of hexadecimal digits successfully read */ if ( (hb = is_hex_digit (*pafter_escape)) != InvDigit ) { int rv = 1; lb = is_hex_digit (*(pafter_escape+1)); if (lb == InvDigit) { lb = hb; hb = 0; } else rv = 2; if ((byte)) *byte = (char)(16 * hb + lb); return rv; } else { if ((byte)) *byte = -1; return 0; } } static int is_oct (const char* pafter_escape, char* byte) { unsigned char ho, mo, lo; /* The return value is the number of octal digits successfully read */ if ( (ho = is_oct_digit (*pafter_escape)) != InvDigit ) { int rv = 1; mo = is_oct_digit (*(pafter_escape+1)); lo = is_oct_digit (*(pafter_escape+2)); if (mo == InvDigit) { lo = ho; ho = 0; mo = 0; } else { rv++; if (lo == InvDigit) { lo = mo; mo = ho; ho = 0; } else rv++; } if ((byte)) *byte = (char)(64 * ho + 8 * mo + lo); return (64 * (int)ho + 8 * (int)mo + (int)lo < 256 ? rv : 0); } else { if ((byte)) *byte = -1; return 0; } } static char process_character (const char* chp, const char** new_chp) { const char* nchp; char byte; int r; if (*chp == ESC_CHAR) { switch (*(chp+1)) { case 'a': byte = '\a'; nchp = chp+2; break; case 'b': byte = '\b'; nchp = chp+2; break; case 'f': byte = '\f'; nchp = chp+2; break; case 'n': byte = '\n'; nchp = chp+2; break; case 'r': byte = '\r'; nchp = chp+2; break; case 't': byte = '\t'; nchp = chp+2; break; case 'v': byte = '\v'; nchp = chp+2; break; case 's': byte = ' '; nchp = chp+2; break; case 'x': if ( (r = is_hex (chp+2, &byte)) && byte != '\0' ) nchp = chp + (r + 2); else { byte = *(chp+1); nchp = chp+2; } break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': if ( (r = is_oct (chp+1, &byte)) && byte != '\0' ) nchp = chp + (r + 1); else { byte = *(chp+1); nchp = chp+2; } break; default: byte = *(chp+1); nchp = chp+2; break; } } else { byte = *chp; nchp = chp+1; } if ((new_chp)) *new_chp = nchp; return byte; } /* Remark: process the substring [BPTR, EPTR) and return the result (NULL in case of error while allocating memory for the result). Precondition is EPTR >= BPTR. */ static char* process_substring (const char* bptr, const char* eptr) { size_t subssize = eptr - bptr + 1; const char* ptr; char *pstr, *pstrp; if ( !(pstr = (char*) calloc(subssize, sizeof(char))) ) return NULL; else { for (pstrp = pstr, ptr = bptr; ptr < eptr; pstrp++) { *pstrp = process_character (ptr, &ptr); } return pstr; } } /* Create and return a vector of strings using the description contained in the string pointed to by STR. The items in STR (to each of which should correspond a string in the returned vector) are separated by the character SEPARATOR. In case of error while allocating memory for the vector and its elements return NULL. Return NULL also if STR == NULL. Remark: SEPARATOR cannot be the nul character. Return NULL if SEPARATOR is the nul character. */ char** ssplit (const char* str, char separator) { size_t i, n; const char *beg, *ptr, *ptr2sep; char** sv; if (!str || separator == '\0') return NULL; for (beg = str; *beg == separator; beg++); /* Now BEG points to the first charatacrer of the buffer pointed to by STR which is not equal to SEPARATOR. */ /* First count the substrings contained in the buffer pointed to by STR. */ for (n = 1, ptr = beg; (ptr2sep = strchr (ptr, separator)) != NULL; n++) { for (ptr = ptr2sep+1; *ptr == separator; ptr++); } /* Now allocate memory for a vector of N+1 char*. If the allocation fails, return NULL. */ if ( !(sv = (char**) malloc ((n+1)*sizeof(char*))) ) return NULL; sv[n] = NULL; for (i = 0, ptr = beg; (ptr2sep = strchr (ptr, separator)) != NULL; i++) { sv[i] = process_substring (ptr, ptr2sep); if (!sv[i]) { delete_string_vector (sv); return NULL; } for (ptr = ptr2sep+1; *ptr == separator; ptr++); } if (*ptr != '\0') { ptr2sep = strchr (ptr, '\0'); sv[i] = process_substring (ptr, ptr2sep); if (!sv[i]) { delete_string_vector (sv); return NULL; } } return sv; } /* Create and return a vector of strings using the characters contained in the string pointed to by STR. To each (eventually escaped) character in this string will correspond exactly one string in the returned vector. Return NULL if STR == NULL or in case of out of memory. */ char** ssplit_former_way (const char* str) { if ((str)) { size_t n, ls = strlen(str); char **sv; const char *ptr, *nptr; sv = (char**) calloc (ls + 1, sizeof(char*)); if (!sv) return NULL; for (n = 0, ptr = str; *ptr != '\0'; ptr = nptr, n++) { sv[n] = (char*) malloc (2 *sizeof(char)); if ((sv[n])) { sv[n][0] = process_character (ptr, &nptr); sv[n][1] = '\0'; } else { delete_string_vector (sv); return NULL; } } return sv; } else return NULL; } /* Process the string pointed to by ISTR and return the result (NULL in case of error while allocating memory for the result). */ char* get_separating_string (const char* istr) { return process_substring (istr, istr+strlen(istr)); } /* Write to the file pointed to by FP the strings contained in the vector SV. Use SEPARATOR to separate each string from the following one. */ void print_string_vector (FILE* fp, const char** sv, char separator) { size_t n; if (!sv) { fputs ("", fp); fputc (separator, fp); } else { for (n = 0; sv[n] != NULL; n++) { fprintf (fp, "\"%s\"%c", sv[n], separator); } } } /* Rearrange the strings of the vector SV in descending order with respect to their length. Rem.: Pre-condition is that SV is NULL-terminated. This function is suitable only for small vectors, since it uses a bubble-sort algorithm. */ void sort_string_vector (char** sv) { if ((sv)) { size_t n, m, l, lmax, poslmax; char *tmp; for (n = 0; sv[n] != NULL; n++) { lmax = strlen(sv[n]); poslmax = n; for (m = n+1; sv[m] != NULL; m++) { if ( (l = strlen(sv[m])) > lmax ) { lmax = l; poslmax = m; } } tmp = sv[n]; sv[n] = sv[poslmax]; sv[poslmax] = tmp; } } } /* Remove duplicates from the vector SV. */ void remove_duplicates_from_string_vector (char** sv) { if ((sv)) { size_t k, m, n; for (n = 0; sv[n] != NULL; n++) { m = n+1; while (sv[m] != NULL) { if (strcmp (sv[m], sv[n]) == 0) { free((void*)sv[m]); for (k = m+1; sv[k] != NULL; k++) sv[k-1] = sv[k]; sv[k-1] = NULL; } else m++; } } } } /* Return 1 if the string pointed to by STR is found in the vector SV, otherwise 0. 0 should be also returned if STR or SV is NULL. */ int is_string_in_vector (const char* str, const char** sv) { if ((sv) && (str)) { size_t n; for (n = 0; sv[n] != NULL && strcmp(str, sv[n]) != 0; n++); return (sv[n] == NULL ? 0 : 1); } else return 0; } /* Return 0 if there is no string in the vector SV which contains the character CH, otherwise return the length of the longest string between those ones which contain the character CH. 0 should also be returned if SV is null. */ size_t is_char_in_vector (int ch, const char** sv) { if ((sv)) { size_t l, lm, n; for (lm = n = 0; sv[n] != NULL; n++) { if ( (strchr (sv[n], ch)) && (l = strlen (sv[n])) > lm) lm = l; } return lm; } else return 0; } /* Remove the memory allocated for the strings of the vector SV and then free the memory allocated for the vector itself. */ void delete_string_vector (char** sv) { size_t n; if ((sv)) { for (n = 0; sv[n] != NULL; n++) { free ((void*)sv[n]); } free((void*)sv); } } /* Return a pointer to the position following the initial segment of STR that does not contain any string from the vector SV. If such an initial segment does not exist, return a pointer to STR. Consider the string STR as ending at the first occurrence of EOS. SV must be NULL terminated, it cannot contain the empty ("") string nor a string of length > 1 with EOS being one of its non-null characters (but SV may well contain the string of length 1 having EOS as its only non-null character). Rem.: EOS can be the null character. If the string pointed to by STR does not contain any EOS character, a buffer overrun will occur. */ char* string_cspn (const char* str, const char** sv, int eos) { register const char *sviptr; register const char *endptr; register const char *nendptr; register const char *ptr; register size_t n; if (!str || !sv) { /* security check */ return NULL; } else { for (endptr = str; *endptr != eos; endptr++); for (nendptr = str; nendptr < endptr; nendptr++) { for (n = 0; sv[n] != NULL; n++) { for (ptr = nendptr, sviptr = sv[n]; *sviptr != '\0' && *sviptr == *ptr; sviptr++, ptr++); if (*sviptr == '\0') return (char*)nendptr; } } return (char*)nendptr; } } /* Return a pointer to the position following the initial segment of STR that consists entirely of strings from the vector SV. If such an initial segment does not exist, return a pointer to STR. Consider the string STR as ending at the first occurrence of EOS. SV must be NULL terminated, it cannot contain the empty ("") string nor a string of length > 1 with EOS being one of its non-null characters (but SV may well contain the string of length 1 having EOS as its only non-null character). Rem.: this function works under the assumption that the strings in the vector SV are ordered according to their lengths, where SV[0] is the string with the greatest length. EOS can be the null character. */ char* string_spn (const char* str, const char** sv, int eos) { register const char *ptr; register const char *nptr; register const char *sviptr; register size_t n; if (!str || !sv) { /* security check */ return NULL; } else { ptr = str; while (*ptr != eos) { /* Rem.: if strlen(sv[n])== 1 and sv[n][0] == EOS, then strstr(ptr, sv[n]) != ptr. Thus, whenever the following for cycle terminates, sv[n] can not be equal to the string "" (i.e. the string having EOS as its only null character). */ for (n = 0; sv[n] != NULL; n++) { for (nptr = ptr, sviptr = sv[n]; *sviptr!='\0' && *sviptr == *nptr; sviptr++, nptr++); if (*sviptr == '\0') { /* Rem.: if sv[n] does not contain any EOS, then by setting PTR to NPTR we do not skip any EOS. */ ptr = nptr; break; } } if (!sv[n]) break; } return (char*)ptr; } } #ifdef _TEST_LINE_SPLIT_ #define I_DEF_SEP ' ' static void print_help (const char* progname) { printf ("Usage: %s STRING\n\n", progname); } static void print_substring (FILE* fp, const char* bptr, const char* eptr, int nl) { const char *ptr; if (eptr > bptr) { for (ptr = bptr; ptr != eptr; ptr++) { putc (*ptr, fp); } if ((nl)) putc ('\n', fp); } } #define BUFFSIZE 1024 int main (int argc, char* argv[]) { if (argc != 2) { print_help(argv[0]); return 1; } else { char** string_vector = NULL; char** sv = NULL; char linebuff[BUFFSIZE] = ""; char *rv, *ptr, *endptr; size_t l; string_vector = ssplit (argv[1], I_DEF_SEP); sv = ssplit_former_way (argv[1]); remove_duplicates_from_string_vector (string_vector); remove_duplicates_from_string_vector (sv); sort_string_vector (string_vector); print_string_vector (stdout, (const char**)string_vector, O_DEF_SEP); l = is_char_in_vector (':', string_vector); printf ("Length of the longest string containing \':\' = %zu\n", l); puts ("\n\nSplitting the string in the former way produces the following result:"); print_string_vector (stdout, (const char**)sv, O_DEF_SEP); do { #ifdef _MINOR_TEST_ puts ("\nEnter a line of text (Ctrl+D to terminate)"); #endif rv = fgets (linebuff, BUFFSIZE, stdin); if ((rv)) { #ifdef _MINOR_TEST_ ptr = string_cspn (linebuff, (const char**)string_vector, '\0'); fputs ("Cspn =", stdout); print_substring (stdout, linebuff, ptr, 0); fputs ("|EoS|\n", stdout); ptr = string_spn (linebuff, (const char**)string_vector, '\0'); fputs ("Spn =", stdout); print_substring (stdout, linebuff, ptr, 0); fputs ("|EoS|\n", stdout); #else unsigned long fieldno; for (fieldno = 1, ptr = linebuff; *ptr != '\0'; fieldno++) { ptr = string_spn (ptr, (const char**)string_vector, '\0'); endptr = string_cspn (ptr, (const char**)string_vector, '\0'); if ((*ptr)) { printf ("%3lu.>", fieldno); print_substring (stdout, ptr, endptr, 0); puts ("<"); } ptr = endptr; } putchar ('\n'); #endif /* _MINOR_TEST_ */ } } while ((rv)); delete_string_vector (string_vector); return 0; } } #endif /* _TEST_LINE_SPLIT_ */ numdiff-5.9.0/getopt1.c0000644000175000017500000000765213054341114014236 0ustar paologpaolog/* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98,2004 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include #endif #ifdef _LIBC # include #else # include "getopt.h" #endif #include "getopt_int.h" #include /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #include #endif #ifndef NULL #define NULL 0 #endif int getopt_long (int argc, char *__getopt_argv_const *argv, const char *options, const struct option *long_options, int *opt_index) { return _getopt_internal (argc, (char **) argv, options, long_options, opt_index, 0, 0); } int _getopt_long_r (int argc, char **argv, const char *options, const struct option *long_options, int *opt_index, struct _getopt_data *d) { return _getopt_internal_r (argc, argv, options, long_options, opt_index, 0, 0, d); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. If an option that starts with '-' (not '--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. */ int getopt_long_only (int argc, char *__getopt_argv_const *argv, const char *options, const struct option *long_options, int *opt_index) { return _getopt_internal (argc, (char **) argv, options, long_options, opt_index, 1, 0); } int _getopt_long_only_r (int argc, char **argv, const char *options, const struct option *long_options, int *opt_index, struct _getopt_data *d) { return _getopt_internal_r (argc, argv, options, long_options, opt_index, 1, 0, d); } #ifdef TEST #include int main (int argc, char **argv) { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 0, 0, 0}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:0123456789", long_options, &option_index); if (c == -1) break; switch (c) { case 0: printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case 'd': printf ("option d with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ numdiff-5.9.0/side.c0000444000175000017500000002537413054341114013576 0ustar paologpaolog/* sdiff-format output routines for GNU DIFF. Copyright (C) 1991, 1992, 1993, 1998, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU DIFF. GNU DIFF is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY. No author or distributor accepts responsibility to anyone for the consequences of using it or for whether it serves any particular purpose or works at all, unless he says so in writing. Refer to the GNU DIFF General Public License for full details. Everyone is granted permission to copy, modify and redistribute GNU DIFF, but only under the conditions described in the GNU DIFF General Public License. A copy of this license is supposed to have been given to you along with GNU DIFF so you can know your rights and responsibilities. It should be in a file named COPYING. Among other things, the copyright notice and this notice must be preserved on all copies. */ /* This file, coming from the source code of GNU DIFF, has been modified by Ivano Primi so that it could be merged into the source code of Numdiff. Numdiff is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. Numdiff 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. */ #include "numdiff.h" static void print_sdiff_common_lines (lin, lin); static void print_sdiff_hunk (struct change *); /* Next line number to be printed in the two input files. */ static lin next0, next1; /* Print the edit-script SCRIPT as a sdiff style output. */ void print_sdiff_script (struct change *script) { next0 = next1 = - files[0].prefix_lines; print_script (script, print_sdiff_hunk); print_sdiff_common_lines (files[0].valid_lines, files[1].valid_lines); } /* Tab from column FROM to column TO, where FROM <= TO. Yield TO. */ static unsigned int tab_from_to (unsigned int from, unsigned int to) { FILE *out = outfile; unsigned int tab; if (!expand_tabs) for (tab = from + TAB_WIDTH - from % TAB_WIDTH; tab <= to; tab += TAB_WIDTH) { putc ('\t', out); from = tab; } while (from++ < to) putc (' ', out); return to; } /* * Print the text for half an sdiff line. This means truncate to width * observing tabs, and trim a trailing newline. Returns the last column * written (not the number of chars). */ static unsigned int print_half_line (char const *const *line, unsigned int indent, unsigned int out_bound) { FILE *out = outfile; register unsigned int in_position = 0; register unsigned int out_position = 0; register char const *text_pointer = line[0]; register char const *text_limit = line[1]; while (text_pointer < text_limit) { register unsigned char c = *text_pointer++; switch (c) { case '\t': { unsigned int spaces = TAB_WIDTH - in_position % TAB_WIDTH; if (in_position == out_position) { unsigned int tabstop = out_position + spaces; if ((expand_tabs)) { if (out_bound < tabstop) tabstop = out_bound; for (; out_position < tabstop; out_position++) putc (' ', out); } else if (tabstop < out_bound) { out_position = tabstop; putc (c, out); } } in_position += spaces; } break; case '\r': { putc (c, out); tab_from_to (0, indent); in_position = out_position = 0; } break; case '\b': if (in_position != 0 && --in_position < out_bound) { if (out_position <= in_position) /* Add spaces to make up for suppressed tab past out_bound. */ for (; out_position < in_position; out_position++) putc (' ', out); else { out_position = in_position; putc (c, out); } } break; case '\f': case '\v': control_char: if (in_position < out_bound) putc (c, out); break; default: if (! ISPRINT (c)) goto control_char; /* falls through */ case ' ': if (in_position++ < out_bound) { out_position = in_position; putc (c, out); } break; case '\n': return out_position; } } return out_position; } /* * Print side by side lines with a separator in the middle. * 0 parameters are taken to indicate white space text. * Blank lines that can easily be caught are reduced to a single newline. */ static void print_1sdiff_line (char const *const *left, char sep, char const *const *right) { FILE *out = outfile; unsigned int hw = sdiff_half_width, c2o = sdiff_column2_offset; unsigned int col = 0; bool put_newline = 0; if (left) { put_newline |= left[1][-1] == '\n'; col = print_half_line (left, 0, hw); } if (sep != ' ') { col = tab_from_to (col, (hw + c2o - 1) / 2) + 1; if (sep == '|' && put_newline != (right[1][-1] == '\n')) sep = put_newline ? '/' : '\\'; putc (sep, out); } if (right) { put_newline |= right[1][-1] == '\n'; if (**right != '\n') { col = tab_from_to (col, c2o); print_half_line (right, col, hw); } } if (put_newline) putc ('\n', out); } /* Print lines common to both files in side-by-side format. */ static void print_sdiff_common_lines (lin limit0, lin limit1) { lin i0 = next0, i1 = next1; /* long len0, len1; */ if (i0 != limit0 || i1 != limit1) { if (!suppress_common_lines) { while (i0 != limit0 && i1 != limit1) print_1sdiff_line (&files[0].linbuf[i0++], ' ', &files[1].linbuf[i1++]); while (i1 != limit1) print_1sdiff_line (0, ')', &files[1].linbuf[i1++]); while (i0 != limit0) print_1sdiff_line (&files[0].linbuf[i0++], '(', 0); } /* else */ /* { */ /* len0 = limit0 - i0; */ /* len1 = limit1 - i1; */ /* fprintf (outfile, "i%ld,%ld\n", len0, len1); */ /* } */ } next0 = limit0; next1 = limit1; } /* Print a hunk of an sdiff diff. This is a contiguous portion of a complete edit script, describing changes in consecutive lines. */ static void print_sdiff_hunk (struct change *hunk) { lin first0, last0, first1, last1; register lin i, j; /* Determine range of line numbers involved in each file. */ enum changes changes = analyze_hunk (hunk, &first0, &last0, &first1, &last1); if (!changes) return; /* Print out lines up to this change. */ print_sdiff_common_lines (first0, first1); /* if ((suppress_common_lines)) */ /* { */ /* long len0 = last0 - first0 + 1; */ /* long len1 = last1 - first1 + 1; */ /* fprintf (outfile, "c%ld,%ld\n", len0, len1); */ /* } */ /* Print ``xxx | xxx '' lines */ if (changes == CHANGED) { for (i = first0, j = first1; i <= last0 && j <= last1; i++, j++) print_1sdiff_line (&files[0].linbuf[i], '|', &files[1].linbuf[j]); changes = (i <= last0 ? OLD : 0) + (j <= last1 ? NEW : 0); next0 = first0 = i; next1 = first1 = j; } /* Print `` > xxx '' lines */ if (changes & NEW) { for (j = first1; j <= last1; ++j) print_1sdiff_line (0, '>', &files[1].linbuf[j]); next1 = j; } /* Print ``xxx < '' lines */ if (changes & OLD) { for (i = first0; i <= last0; ++i) print_1sdiff_line (&files[0].linbuf[i], '<', 0); next0 = i; } } /* * This function does the same actions as print_half_line(), * but takes as first argument a simple pointer to * const char */ static unsigned int display_half_line (const char* line, unsigned int indent, unsigned int out_bound) { FILE *out = outfile; register unsigned int in_position = 0; register unsigned int out_position = 0; register const char *text_pointer = line; register const char *text_limit = line; for (; *text_limit != '\0'; text_limit++); while (text_pointer < text_limit) { register unsigned char c = *text_pointer++; switch (c) { case '\t': { unsigned int spaces = TAB_WIDTH - in_position % TAB_WIDTH; if (in_position == out_position) { unsigned int tabstop = out_position + spaces; if ((expand_tabs)) { if (out_bound < tabstop) tabstop = out_bound; for (; out_position < tabstop; out_position++) putc (' ', out); } else if (tabstop < out_bound) { out_position = tabstop; putc (c, out); } } in_position += spaces; } break; case '\r': { putc (c, out); tab_from_to (0, indent); in_position = out_position = 0; } break; case '\b': if (in_position != 0 && --in_position < out_bound) { if (out_position <= in_position) /* Add spaces to make up for suppressed tab past out_bound. */ for (; out_position < in_position; out_position++) putc (' ', out); else { out_position = in_position; putc (c, out); } } break; case '\f': case '\v': control_character: if (in_position < out_bound) putc (c, out); break; default: if (! ISPRINT (c)) goto control_character; /* falls through */ case ' ': if (in_position++ < out_bound) { out_position = in_position; putc (c, out); } break; case '\n': return out_position; } } return out_position; } /* * Print side by side lines with a separator in the middle. * 0 parameters are taken to indicate white space text. * Blank lines that can easily be caught are reduced to a single newline. * This function works almost like print_1sdiff_line() (see above), * but the parameter list is slightly different. * In addition, different separators are used */ void print_1overview_line (const char *left, int are_different, const char *right) { FILE *out = outfile; unsigned int hw = sdiff_half_width, c2o = sdiff_column2_offset; unsigned int col = 0; bool put_newline = 0; register const char *end_of_left = left; register const char *end_of_right = right; const char *sep = ":!:"; if (left) { for (; *end_of_left != '\0'; end_of_left++); if (end_of_left != left) end_of_left--; put_newline |= *end_of_left == '\n'; col = display_half_line (left, 0, hw); } else sep = ":>:"; if (!right) sep = ":<:"; if ((are_different)) { col = tab_from_to (col, (hw + c2o - 3) / 2) + 3; fputs (sep, out); } if (right) { for (; *end_of_right != '\0'; end_of_right++); if (end_of_right != right) end_of_right--; put_newline |= (*end_of_right == '\n'); if (*right != '\n') { col = tab_from_to (col, c2o); display_half_line (right, col, hw); } } if (put_newline) putc ('\n', out); } numdiff-5.9.0/COPYING0000444000175000017500000010451313054341114013532 0ustar paologpaolog GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . numdiff-5.9.0/docs/0000755000175000017500000000000013054341114013425 5ustar paologpaolognumdiff-5.9.0/docs/numdiff.html0000644000175000017500000072662113054341114015761 0ustar paologpaolog Numdiff Manual 5.9

Numdiff Manual 5.9

Table of Contents

Next: , Previous: , Up: (dir)   [Contents][Index]

Numdiff User Manual

“...und der eignen Kraft vertrauend steigt ein frei Geschlecht empor!”



This manual describes how to install and use Numdiff, a program which compares putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats.

Copyright © 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi ivprimi(at)libero(dot)it

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in GNU Free Documentation License.


Next: , Previous: , Up: Top   [Contents][Index]

1 Copying

Numdiff (also written numdiff) is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

Numdiff is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.


Next: , Previous: , Up: Top   [Contents][Index]

2 Acknowledgments

I want to thank Mr. Norman Clerman norm(dot)opcon(at)fuse(dot)net for several suggestions he gave me to improve the readability and the effectiveness of the output produced by Numdiff. He also pointed out the need to implement a filter to resynchronize the lines between two files in case of addition or deletion of one or more lines. I have to give him credit for the urge to prepare the versions 4.x and 5.x of Numdiff.

Moreover, I want to thank my friends Mariapia Palombaro, since she removed some errors while reviewing the first version of this document, and Paolo Caramanica, who suggested me to add more information to the output of the option -S.


Next: , Previous: , Up: Top   [Contents][Index]

3 Overview

Computer users often find occasion to ask how two files differ. Perhaps one file is a newer version of the other file. Or maybe the two files started out as identical copies but were changed by different people.

There are several ways to look at the differences between two files. One way consists in looking at the series of lines that were deleted from, inserted in, or changed in one file to produce the other file. The well-known diff program compares two files line by line, finds groups of lines that differ, and reports each group of differing lines. Without particular options, when comparing lines the diff program considers any change in the amount or in the type of the characters as a difference. However, trough some command line options the user can suppress the output of certain kinds of differences that are not important to him. For instance, diff provides options to ignore differences in the amount of white space between words or lines, or differences in alphabetic case.

Another way to look at the differences between two files consists in considering the words that were deleted from, inserted in, or changed in one file to produce the other file. Here “word” refers to a sequence of non white-space characters delimited by a couple of white-spaces, one before and the other one after the word.

The wdiff program by François Pinard pinard(at)iro(dot)umontreal(dot)ca compares words in two files and reports the differences.

Finally, one can regard the differences between two files as a sequence of pairs of differing bytes. The cmp program reports the differences between two files byte by byte, instead of line by line or word by word. As a result, it is often more useful than diff or wdiff for comparing binary files.

However, none of these approaches turns out to be good when you want to compare a couple of text files composed partially or entirely by numerical fields. In such a case what you want to obtain usually is a list of the numerical fields in the second file which numerically differ from the corresponding fields in the first file. But, while a number can be written using different notations, programs like diff or wdiff can not recognize whether a difference between two numeric fields is only due to the notation or is actually a difference of numerical values.

For instance, 11.23 and 11.2300000 are the same number but represented in different ways. If you are interested in the numerical values, the difference in the representation is not meaningful and then should be ignored. However, diff and wdiff always consider the previous one as an actual difference: there is no way for you to tell these programs to ignore it.

Another example of this type is given by 98765.4321 and 9.87654321E04. Here the difference is only due to the use of the scientific notation in place of the ordinary decimal notation.

In addition, depending on your country you could stick to different conventions in writing numbers. For example, the amount “three hundred millions and fifty-two thousands of dollars and forty-six cents” is usually written by an Italian accountant as 300.052.000,46$ while an American accountant would write 300,052,000.46$. Of course, 300.052.000,46$ and 300,052,000.46$ represent the same amount of money but diff and wdiff would report a difference, which probably is not what you want in such a case.

Lastly, sometimes you could wish to ignore even differences in numerical values as long as they do not exceed a certain threshold. In other words, you could desire to suppress the report of all “small” numerical differences.

For example, it could happen that you want to ignore all numerical differences whose absolute value is not greater than 0.0001. If this is the case, then the numerical fields 33 and 33.00009 should be considered equal, while 33 and 33.00011 should be reported as different.

However, diff and wdiff can not be used to ignore small numerical differences, since they do not even know what a numerical difference is.

These are the reasons why I decided to implement a new program with the capability to appropriately compare files containing numerical fields. In writing this program I was inspired by ndiff, a GPL’ed software by Nelson H. Baabe of the Salt Lake City University. ndiff is actually a good tool, and I used it for a while. But I did not completely like the way it works, and so numdiff was conceived. Although ndiff inspired numdiff, they are completely different from the viewpoint of the source code: numdiff has been entirely written from scratch with the addition of code coming from GNU bc, GNU diff and GNUlib. In addition, the last versions of Numdiff offer much more features than ndiff does.

numdiff can be used to compare putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. numdiff takes two mandatory arguments, the paths of the two files to compare, and, after splitting them into lines and the lines into fields according to a given list of field delimiters, it compares every field of every line of the first file with the corresponding field of the second file. What corresponding here exactly means depends on the options passed to the program on the command line. With no options, corresponding means the field of the second file at the same position, where position refers both to the line number and to the location within the line. If the compared fields are both legal numerical values, then numdiff performs a numerical comparison between them, otherwise it performs a literal comparison, i.e. the usual byte-by-byte comparison. In case of literal comparison, two fields are regarded as equal if they are formed by the same sequence of characters. In case of numerical comparison and without specific command line options, two fields are regarded as equal if their numerical difference is zero. Mind that, if you do not explicitly specify a list of field delimiters by means of the option -s or -D, numdiff takes as field delimiters the characters newline (‘\n’, ASCII code 0x0A), horizontal tabulation (‘\t’, ASCII code 0x09), and blank (‘ ’, ASCII code 0x20).

For example, if the file list1 contains the data

accident        123     23Joshua          34.55           +3+4i	        water
dog       -3455.321     cat             2.345678e-9     .0005-6.23e2i

and file list2 contains the data

Accident        123     23456          34.5500         +3.0001+4i
dog       -3455.320098  Cat     +2.345678e-9            -6.23e2i    $$$
A new line

then the output of the command ‘numdiff list1 list2’ will be:

----------------
##1       #:1   <== accident
##1       #:1   ==> Accident
@                                                     @@
##1       #:3   <== 23Joshua
##1       #:3   ==> 23456
@                                                     @@
##1       #:5   <== +3+4i
##1       #:5   ==> +3.0001+4i
@ Absolute error = 1.0000000000e-4, Relative error = 2.0000000000e-5
##1       #>6   <== water
##1             ==>
@ Line 1 in file "list2" is shorter than expected!
----------------
##2       #:2   <== -3455.321
##2       #:2   ==> -3455.320098
@ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7
##2       #:3   <== cat
##2       #:3   ==> Cat
@                                                     @@
##2       #:5   <== .0005-6.23e2i
##2       #:5   ==> -6.23e2i
@ Absolute error = 5.0000000000e-4, Relative error = 8.0256821830e-7
##2             <==
##2       #>6   ==> $$$
@ Line 2 in file "list1" is shorter than expected!
----------------
##3             <==
##3       #>1   ==> A new line
@ Line 3 in file "list1" is shorter than expected!
----------------
          <==
##4       ==> 


+++  File "list1" differs from file "list2"

At the same time numdiff will print the following error message on stderr:

***  End of file "list1" reached while trying to read line 4.
     File "list2" has more lines than file "list1",
     line 4 is the last one read from file "list2"

It is worth remarking that numdiff can recognize complex numbers, provided that they are written in the form a+bi or a-bi with no extra characters between the values a, b and the sign + or - (the symbol i, used to represent the imaginary unit, can be changed by a suitable command line option, see Invoking numdiff). Do not worry if you do not know what complex numbers are: probably you will never manage files containing complex numbers, thus you can live happily without them. :)

We consider now an example which shows how Numdiff can resynchronize the lines between two files in case of addition or deletion of one or more lines. The versions of Numdiff prior to 5 did not work well if one of the two files to compare contains in the middle some lines more or less than the other one. For instance, if you have one file that is 1000 lines long that you are comparing to a second file 1001 lines long, and except for that one extra line, located, let us say, at line 500, the files are identical, then numdiff version 4.x does not show only the one line difference: once the files are out of synchronization numdiff 4.x reports every line as different. Since version 5 it is possible in such cases to activate a filter which handles additions and deletions of lines. There are several options ruling how the filter actually works, and I will give later a detailed explanation on how to use them to obtain each time the wished result. The simplest way to activate the filter consists in using the option -z @. If bill1 and bill2 are given by

 Month          Expenses
-------------------------
 Jan09          $  233.56
 Feb09          $  850.77
 Mar09          $   12.55
 Apr09          $  524.00
 May09          $   78.25
 Jun09          $  230.00
 Jul09          $  443.10
 Aug09          $   67.65
 Sep09          $   10.00
 Oct09          $  201.45
 Nov09          $  110.00
 Dec09          $  200.27
-------------------------
Total           $ 2961.60

and

 Month          Expenses
 Jan09          $  234.00
 Mar09          $   13.00
 May09          $   78.25
 Jul09          $  443.10
 Sep09          $   10.00
 Nov09          $  110.00
 Jan10          $  200.00
-------------------------

Total           $ 1088.35   

respectively, then the differences between the two files are:

  • the insertion of the separator ------------------------- in bill1 before the list of the months,
  • the deletion in bill2 of the lines related to the expenses for the months February, April, June, August, October, December,
  • small changes in bill2 to the expenses of the months January 2009 and March,
  • the presence in bill2 of an entry for January 2010 just before the separator -------------------------,
  • the addition of an empty line to bill2 after the separator -------------------------,
  • and the different values for the total sum of the expenses.

The output of the command ‘numdiff -z @ -V bill1 bill2’ (I have added here the option -V to let Numdiff show which couples of lines it is comparing each time) shows exactly the expected differences:

----------------
##2       <== -------------------------
          ==>

----------------
##3       <==  Jan09          $  233.56
##2       ==>  Jan09          $  234.00

##3       #:3   <== 233.56
##2       #:3   ==> 234.00
@ Absolute error = 4.4000000000e-1, Relative error = 1.8838842268e-3
----------------
##4       <==  Feb09          $  850.77
          ==>

----------------
##5       <==  Mar09          $   12.55
##3       ==>  Mar09          $   13.00

##5       #:3   <== 12.55
##3       #:3   ==> 13.00
@ Absolute error = 4.5000000000e-1, Relative error = 3.5856573705e-2
----------------
##6       <==  Apr09          $  524.00
          ==>

----------------
##8       <==  Jun09          $  230.00
          ==>

----------------
##10      <==  Aug09          $   67.65
          ==>

----------------
##12      <==  Oct09          $  201.45
          ==>

----------------
##14      <==  Dec09          $  200.27
##8       ==>  Jan10          $  200.00

##14      #:1   <== Dec09
##8       #:1   ==> Jan10
@                                                     @@
##14      #:3   <== 200.27
##8       #:3   ==> 200.00
@ Absolute error = 2.7000000000e-1, Relative error = 1.3500000000e-3
----------------
          <==
##10      ==> 

----------------
##16      <== Total           $ 2961.60
##11      ==> Total           $ 1088.35

##16      #:3   <== 2961.60
##11      #:3   ==> 1088.35
@ Absolute error = 1.8732500000e+3, Relative error = 1.7211834428e+0

+++  File "bill1" differs from file "bill2"

Looking at the displayed report we see that:

  • the second line of file bill1, i.e. the one containing the separator, has no correspondance, or, if you prefer, has been deleted from file bill2.
  • The lines related to the months January and March 2009 have been slightly modified in bill2, namely the values of the expenses are slightly different. Notice that the line with the expenses for January 2009 is the third one in file bill1 and the second one in file bill2. This information is printed by Numdiff in the form
    ##3       <==  Jan09          $  233.56
    ##2       ==>  Jan09          $  234.00
    

    Analogously,

    ##5       <==  Mar09          $   12.55
    ##3       ==>  Mar09          $   13.00
    

    says that the line for March is the fifth one in bill1 and the third one in bill2.

  • The line related to the total amount of the expenses appears also differently in the two files, since the amount of the expenses is different. Notice that this line is the 16th one in file bill1 and the 11th one in file bill2.
  • The lines related to the months February, April, June, August and October, i.e. the lines no. 4, 6, 8, 10, and 12 of bill1, are not present in bill2.
  • The line of bill1 with the expenses for December 2009 is replaced in bill2 by the line containing the value of the expenses for January 2010.
  • The tenth line of bill2, i.e. the empty line after the separator, is not present in bill1. With respect to bill1 this line represents then an addition.

If you compare bill1 and bill2 without using the option -z @, the result is completely misleading. This is the output of ‘numdiff -V bill1 bill2’:

----------------
##2       <== -------------------------
##2       ==>  Jan09          $  234.00

##2       #:1   <== -------------------------
##2       #:1   ==> Jan09
@                                                     @@
##2             <==
##2       #>2   ==> $  234.00
@ Line 2 in file "bill1" is shorter than expected!
----------------
##3       <==  Jan09          $  233.56
##3       ==>  Mar09          $   13.00

##3       #:1   <== Jan09
##3       #:1   ==> Mar09
@                                                     @@
##3       #:3   <== 233.56
##3       #:3   ==> 13.00
@ Absolute error = 2.2056000000e+2, Relative error = 1.6966153846e+1
----------------
##4       <==  Feb09          $  850.77
##4       ==>  May09          $   78.25

##4       #:1   <== Feb09
##4       #:1   ==> May09
@                                                     @@
##4       #:3   <== 850.77
##4       #:3   ==> 78.25
@ Absolute error = 7.7252000000e+2, Relative error = 9.8724600639e+0
----------------
##5       <==  Mar09          $   12.55
##5       ==>  Jul09          $  443.10

##5       #:1   <== Mar09
##5       #:1   ==> Jul09
@                                                     @@
##5       #:3   <== 12.55
##5       #:3   ==> 443.10
@ Absolute error = 4.3055000000e+2, Relative error = 3.4306772908e+1
----------------
##6       <==  Apr09          $  524.00
##6       ==>  Sep09          $   10.00

##6       #:1   <== Apr09
##6       #:1   ==> Sep09
@                                                     @@
##6       #:3   <== 524.00
##6       #:3   ==> 10.00
@ Absolute error = 5.1400000000e+2, Relative error = 5.1400000000e+1
----------------
##7       <==  May09          $   78.25
##7       ==>  Nov09          $  110.00

##7       #:1   <== May09
##7       #:1   ==> Nov09
@                                                     @@
##7       #:3   <== 78.25
##7       #:3   ==> 110.00
@ Absolute error = 3.1750000000e+1, Relative error = 4.0575079872e-1
----------------
##8       <==  Jun09          $  230.00
##8       ==>  Jan10          $  200.00

##8       #:1   <== Jun09
##8       #:1   ==> Jan10
@                                                     @@
##8       #:3   <== 230.00
##8       #:3   ==> 200.00
@ Absolute error = 3.0000000000e+1, Relative error = 1.5000000000e-1
----------------
##9       <==  Jul09          $  443.10
##9       ==> -------------------------

##9       #:1   <== Jul09
##9       #:1   ==> -------------------------
@                                                     @@
##9       #>2   <== $  443.10
##9             ==>
@ Line 9 in file "bill2" is shorter than expected!
----------------
##10      <==  Aug09          $   67.65
##10      ==> 

##10      #>1   <== Aug09          $   67.65
##10            ==>
@ Line 10 in file "bill2" is shorter than expected!
----------------
##11      <==  Sep09          $   10.00
##11      ==> Total           $ 1088.35

##11      #:1   <== Sep09
##11      #:1   ==> Total
@                                                     @@
##11      #:3   <== 10.00
##11      #:3   ==> 1088.35
@ Absolute error = 1.0783500000e+3, Relative error = 1.0783500000e+2
----------------
##12      <==  Oct09          $  201.45
          ==>


***  End of file "bill2" reached while trying to read line 12.
     File "bill1" has more lines than file "bill2",
     line 12 is the last one read from file "bill1"


+++  File "bill1" differs from file "bill2"

Numdiff compares now the first, second, third line of bill1 with the first, second, third line of bill2, and so on. But probably this is not what you want in such a case: what is reasonable here is to compare entries related to the same month and not lines having the same location, i.e. the same line number.

Numdiff offers also an option to run just the filter and see how it resynchronizes the two given files without performing any comparison of corresponding lines. The output of ‘numdiff -z @ -f bill1 bill2’ is

 Month          Expenses          Month          Expenses
-------------------------     <
 Jan09          $  233.56         Jan09          $  234.00
 Feb09          $  850.77     <
 Mar09          $   12.55         Mar09          $   13.00
 Apr09          $  524.00     <
 May09          $   78.25         May09          $   78.25
 Jun09          $  230.00     <
 Jul09          $  443.10         Jul09          $  443.10
 Aug09          $   67.65     <
 Sep09          $   10.00         Sep09          $   10.00
 Oct09          $  201.45     <
 Nov09          $  110.00         Nov09          $  110.00
 Dec09          $  200.27     |   Jan10          $  200.00
-------------------------        -------------------------
                              >
Total           $ 2961.60        Total           $ 1088.35


+++  File "bill1" differs from file "bill2"

and shows that the filter is doing its job in the right way, associating the lines according to the month and not to the line number. Running just the filter is extremely useful in all situations when you are not sure if the filter is working as you wish. You have indeed to instruct the filter in the right way to let it work correctly, and this requires the use of different options depending on the structure of the files to compare. Since guessing the right options can be sometimes tricky, running just the filter and see the result is the best way to be certain that you are setting up everything correctly. Later, see Filtering, I will explain in detail

  • what the filter does behind the scenes to understand if and how it has to resynchronize the files to compare,
  • and how the related options affect the action of the filter.

By the way, it is even possible to use -f without any other additional option for the filter, like in ‘numdiff -f bill1 bill2’, but the result is more or less the same you would obtain by performing a byte-by-byte comparison with removal of the field delimiters.

The option -f can be followed by an argument in the form of an integer number whose meaning will be explained later, see Use of the option -f.

Even if the output of numdiff is supposed to be self-explanatory, in the next section I will explain in details all you should know about it.


3.1 Output format

Let us go back to our first example. If the files list1 and list2 contain the data

accident        123     23Joshua          34.55           +3+4i	        water
dog       -3455.321     cat             2.345678e-9     .0005-6.23e2i

and

Accident        123     23456          34.5500         +3.0001+4i
dog       -3455.320098  Cat     +2.345678e-9            -6.23e2i    $$$
A new line

respectively, then the output of the command ‘numdiff list1 list2’ will be:

----------------
##1       #:1   <== accident
##1       #:1   ==> Accident
@                                                     @@
##1       #:3   <== 23Joshua
##1       #:3   ==> 23456
@                                                     @@
##1       #:5   <== +3+4i
##1       #:5   ==> +3.0001+4i
@ Absolute error = 1.0000000000e-4, Relative error = 2.0000000000e-5
##1       #>6   <== water
##1             ==>
@ Line 1 in file "list2" is shorter than expected!
----------------
##2       #:2   <== -3455.321
##2       #:2   ==> -3455.320098
@ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7
##2       #:3   <== cat
##2       #:3   ==> Cat
@                                                     @@
##2       #:5   <== .0005-6.23e2i
##2       #:5   ==> -6.23e2i
@ Absolute error = 5.0000000000e-4, Relative error = 8.0256821830e-7
##2             <==
##2       #>6   ==> $$$
@ Line 2 in file "list1" is shorter than expected!
----------------
##3             <==
##3       #>1   ==> A new line
@ Line 3 in file "list1" is shorter than expected!
----------------
          <==
##4       ==> 


+++  File "list1" differs from file "list2"

numdiff prints a report on the standard output for every field of the first file which differs from the corresponding field of the second file.

This report indicates first the locations of the fields, namely the numbers of the lines where the fields appear and their positions within the line. The position in the line is “1” for the first field of a line, “2” for the second field, “3” for the third one, and so on: fields are numerated starting from the left hand of the line and proceeding towards the right hand. For each report the line number is introduced by the symbol “##”, while the field number by “#:”. Then numdiff shows in what the difference consists. For example,

##1       #:1   <== accident
##1       #:1   ==> Accident
@                                                     @@

means that the first field of the first line is “accident” in the first file, while in the second file it appears as “Accident”. This difference could be then canceled by removing “accident” from the first file and inserting “Accident” in place of it. The arrows “<==” and “==>” try to visualize this idea. Analogously,

##2       #:2   <== -3455.321
##2       #:2   ==> -3455.320098
@ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7

means that the second field of the second line is “-3455.321” in the first file and “-3455.320098” in the second one. Since the contents of the field are numerical in both files, numdiff also prints the absolute and relative errors.

The absolute error (or absolute difference) is given by the absolute value of the difference between the values appearing in the two files.

The relative error (or relative difference) is actually defined in a more complicated way. If n1 is the value appearing in the first file and n2 is the value in the second file, then the absolute error is given by the formula A=|n1-n2|, while the relative error R is given by:

  • R = 0 if n1 and n2 are equal,
  • Inf (infinity) if n2 differs from n1 and at least one of them is zero,
  • R = A/ min(|n1|, |n2|) if n1 and n2 are both non zero and n2 differs from n1. min(|n1|, |n2|) denotes the minimum between the absolute value of n1 and the absolute value of n2.

With these definitions of absolute and relative error it turns out that A(n2, n1) = A(n1, n2) and R(n2, n1) = R(n1, n2). In other words, the absolute/relative error does not change if you only change the order of the compared values. Since version 5 it is actually possible to let Numdiff compute the relative error always with respect to the value from the first file or always with respect to the value from the second file, instead of using the preceding formula. This can be done through the option -F, see Alternative formulas for the computation of the relative difference.

If at least one of the compared fields is not numerical, then the output line reporting absolute and relative errors is replaced by the separator:

@                                                     @@

It can happen that a line in one of the two files to compare contains more fields than the corresponding line of the other file. If this is the case, numdiff reports this difference by telling that a certain line (identified by its line number) appears to be shorter than expected, just as in

##1       #>6   <== water
##1             ==>
@ Line 1 in file "list2" is shorter than expected!

or in

##3             <==
##3       #>1   ==> A new line
@ Line 3 in file "list1" is shorter than expected!

In addition, numdiff shows the tail of the longer line, using the notation “#>n” to indicate the number n of the first field of the longer line for which there is no corresponding field in the shorter line. For example,

##1       #>6   <== water
##1             ==>
@ Line 1 in file "list2" is shorter than expected!

means that none of the fields of the first line starting from the sixth one has a corresponding field in the second file (list2). In this context, the symbol <<*>> (if it appears) is used to denote the End-Of-File, i.e. a line or the tail of a line which is located at the end of the corresponding file and does not have a terminating newline character.

It can also happen that one of the two files to compare has less lines than the other one. In this case, if no special option is passed to the program, numdiff prints the number of the first line which appears in only one of the two files and a message on the standard error telling in which of the two files the end has been prematurely reached:

***  End of file "list1" reached while trying to read line 4.
     File "list2" has more lines than file "list1",
     line 4 is the last one read from file "list2"

Unless the option -q is used (see Invoking numdiff), numdiff prints to the standard output a message reporting the final status of the comparison. This message says either the two files are equal or they are different, just as in the example we are considering:

+++  File "list1" differs from file "list2"

Next: , Previous: , Up: Overview   [Contents][Index]

3.2 Overview mode

Since version 5.6 an alternative way to display the differences between two files is available, which can be activated through the option -O. If this option is present on the command line, numdiff prints a side-by-side report instead of the usual one.

For example, if sheet1 contains the text

A    1    1
B    2    4
C    3    9
D    4   16
E    5   25
F    6   36
G    7   49
H    8   64
I    9   81
J   10  100

and sheet2 the following lines

A    1      1
B    2      4
C    3.3    9.03
D    4     16
E    5.5   25.05
F    6.6   36
G    7.7   49.49
H    8     64
I    9.9   81.09

then ‘numdiff -O sheet1 sheet2’ prints this report

A    1    1                            A    1      1
B    2    4                            B    2      4
C    3    9                         :!:C    3.3    9.03
D    4   16                            D    4     16
E    5   25                         :!:E    5.5   25.05
F    6   36                         :!:F    6.6   36
G    7   49                         :!:G    7.7   49.49
H    8   64                            H    8     64
I    9   81                         :!:I    9.9   81.09
J   10  100                         :<:

***  End of file "sheet2" reached while trying to read line 10.
     File "sheet1" has more lines than file "sheet2",
     line 10 is the last one read from file "sheet1"


+++  File "sheet1" differs from file "sheet2"

On the left side you can see the lines coming from the file specified as first on the command line, i.e. sheet1, on the right side the lines from the second file of the command line, in this case sheet2. In the middle there is a gutter which contains one of these markers:

white spaces

The corresponding lines are in common. That is, either the lines are identical, or the difference is ignored because of one of the options -s, -D, -I, -X, -a, -r, -P, or -N.

:!:

The corresponding lines have at least one field which differs.

:<:

The files differ and only the first file contains the line.

:>:

The files differ and only the second file contains the line.

In the case of sheet1 and sheet2 a message is printed after the report saying that the end of the second file has been prematurely reached. The two files do not have indeed the same number of lines and the filter has not been activated.

The option -O can take an optional argument, which allows to set the width of the output and eventually to suppress common lines, see Invoking numdiff. The default value for the width of the side-by-side report is 130. No wonder then that the command ‘numdiff -O40 sheet1 sheet2’ displays a report with shorter lines:

A    1    1           A    1      1
B    2    4           B    2      4
C    3    9       :!: C    3.3    9.03
D    4   16           D    4     16
E    5   25       :!: E    5.5   25.05
F    6   36       :!: F    6.6   36
G    7   49       :!: G    7.7   49.49
H    8   64           H    8     64
I    9   81       :!: I    9.9   81.09
J   10  100       :<:

***  End of file "sheet2" reached while trying to read line 10.
     File "sheet1" has more lines than file "sheet2",
     line 10 is the last one read from file "sheet1"


+++  File "sheet1" differs from file "sheet2"

A negative argument makes that only the differences are listed in the side-by-side report, as shown by the output of the command ‘numdiff -O40 sheet1 sheet2’:

C    3    9       :!: C    3.3    9.03
E    5   25       :!: E    5.5   25.05
F    6   36       :!: F    6.6   36
G    7   49       :!: G    7.7   49.49
I    9   81       :!: I    9.9   81.09
J   10  100       :<:

***  End of file "sheet2" reached while trying to read line 10.
     File "sheet1" has more lines than file "sheet2",
     line 10 is the last one read from file "sheet1"


+++  File "sheet1" differs from file "sheet2"

If you set the width of the report to a too small value, it can happen that some or even all lines from the compared files appear truncated as in the output of ‘numdiff -O24 sheet1 sheet2’:

A    1         A    1  
B    2         B    2  
C    3    :!:  C    3.3
D    4         D    4  
E    5    :!:  E    5.5
F    6    :!:  F    6.6
G    7    :!:  G    7.7
H    8         H    8  
I    9    :!:  I    9.9
J   10    :<:

***  End of file "sheet2" reached while trying to read line 10.
     File "sheet1" has more lines than file "sheet2",
     line 10 is the last one read from file "sheet1"


+++  File "sheet1" differs from file "sheet2"

If you set the width of the report to a very small value, Numdiff ignores it and uses the default value, i.e. 130.

Notice that the numeric argument must immediately follow the option -O, intermediate spaces are not allowed. This is also the case for the optional argument of -f, while the options of Numdiff which require a mandatory argument permit the presence of intermediate spaces between them and the argument.

The option -O can be used together with any other option of Numdiff except for -f, -q, -U, -E, -V and -b. When -O is in use, -U, -E, -V and -b are ignored. If -q is present on the command line together with -O, then -O is ignored. Finally, if both -f and -O are present, then the behavior depends on the order: the option which appears first on the command line is the one which matters.

Therefore, the command ‘numdiff -O40 -f sheet1 sheet2’ displays the same report as ‘numdiff -O40 sheet1 sheet2’, while the output of ‘numdiff -f -O40 sheet1 sheet2’ is given by

A    1    1                            A    1      1
B    2    4                            B    2      4
C    3    9                          | C    3.3    9.03
D    4   16                            D    4     16
E    5   25                          | E    5.5   25.05
F    6   36                          | F    6.6   36
G    7   49                          | G    7.7   49.49
H    8   64                            H    8     64
I    9   81                          | I    9.9   81.09
J   10  100                          <


+++  File "sheet1" differs from file "sheet2"

and coincides then with the output of ‘numdiff -f sheet1 sheet2’.

The option -O can be used together with the filter to cope with the addition/deletion of lines. If the file sheet3 contains the text

A    1      1
C    3.3    9.03
E    5.5   25.05
G    7.7   49.49
I    9.9   81.09
J    10   100.00
K    0      0.02

then ‘numdiff -O40 sheet1 sheet3’ prints a wrong report, as in the example with files bill1 and bill2:

A    1    1           A    1      1
B    2    4     :!:   C    3.3    9.03
C    3    9     :!:   E    5.5   25.05
D    4   16     :!:   G    7.7   49.49
E    5   25     :!:   I    9.9   81.09
F    6   36     :!:   J    10   100.00
G    7   49     :!:   K    0      0.02
H    8   64     :<:

***  End of file "sheet3" reached while trying to read line 8.
     File "sheet1" has more lines than file "sheet3",
     line 8 is the last one read from file "sheet1"


+++  File "sheet1" differs from file "sheet3"

On the other hand, the presence of -z @ makes Numdiff always compare fields of corresponding lines, as shown by the output of the command ‘numdiff -O40 -z @ sheet1 sheet3’:

A    1    1           A    1      1
B    2    4     :<:
C    3    9     :!:   C    3.3    9.03
D    4   16     :<:
E    5   25     :!:   E    5.5   25.05
F    6   36     :<:
G    7   49     :!:   G    7.7   49.49
H    8   64     :<:
I    9   81     :!:   I    9.9   81.09
J   10  100           J    10   100.00
                :>:   K    0      0.02

+++  File "sheet1" differs from file "sheet3"

Side-by-side format is easy to read, but it has limitations. It generates much wider output than usual, and truncates lines that are too long to fit. Also, it relies on lining up output quite heavily, so its output looks particularly bad if you use varying width fonts, nonstandard tab stops, or nonprinting characters.


Next: , Previous: , Up: Overview   [Contents][Index]

3.3 Output of the filter

The output produced just by running the filter (option -f) is a side-by-side difference listing of the compared files like the one displayed by GNU sdiff. The files are listed in two columns with a gutter between them. The gutter contains one of the following markers:

white space

The corresponding lines are in common. That is, either the lines are identical, or the difference is ignored because of one of the options -s, -D, -I, -X, -z, or -Z.

|

The corresponding lines differ, and they are either both complete or both incomplete.

<
(

The files differ and only the first file contains the line.

>
)

The files differ and only the second file contains the line.

\

The corresponding lines differ, and only the first line is incomplete.

/

The corresponding lines differ, and only the second line is incomplete.

An input line is incomplete if its last character is not a newline. This can happen only if the line is the last one of its file. When an output line of the side by side difference listing represents two differing lines, one might be incomplete while the other is not. In this case the gutter is marked ‘\’ if the line from the first file is incomplete, ‘/’ if the line from the second file is it.

Like -O, the option -f can take an optional argument which allows to set the width of the output and eventually to suppress common lines, see Invoking numdiff and Use of the option -f.

More generally, the user can always make numdiff avoid to print, partially or totally, the messages that it would otherwise send to standard output. This can be achieved by some suitable command line options, see Invoking numdiff.


Previous: , Up: Overview   [Contents][Index]

3.4 Raw output

Since version 5.9 Numdiff can report the results of the comparison of two files in a particularly compact format, which can be easily parsed by other programs. This raw format is chosen by Numdiff whenever the user requests it through the command line option --raw. Below you can see an example of raw output in the case of the comparison of the files list1 and list2 from section Output format:

1:1:1:1:*:*:accident ==> Accident
1:1:3:3:*:*:23Joshua ==> 23456
1:1:5:5:1.0000000000e-4:2.0000000000e-5:+3+4i ==> +3.0001+4i
1:1:6:*:water
2:2:2:2:9.0200000000e-4:2.6104672633e-7:-3455.321 ==> -3455.320098
2:2:3:3:*:*:cat ==> Cat
2:2:5:5:5.0000000000e-4:8.0256821830e-7:.0005-6.23e2i ==> -6.23e2i
2:2:*:6:$$$
3:3:*:1:A new line
*:4

+++  File "list1" differs from file "list2"

The raw format is not at all convenient for humans. It has been provided only for being used by the forthcoming graphic user interface of Numdiff (yes, Numdiff will have a GUI sometime in the future!).


Next: , Previous: , Up: Top   [Contents][Index]

4 Installing

To successfully compile, build and install Numdiff some tools are required. The first one is an ANSI C compiler. This compiler should at least accept the option -o to write its output to a specified file, the option -D for macros predefinition, the option -l to search for a specified library, and the options -I and -L to add a given directory to the search path for include and library files respectively.

In addition, you need a POSIX implementation of the make utility (I used both GNU make and smake by Joerg Schilling to compile Numdiff) and a POSIX implementation of the commands rm and find. At last, you need a proper installation of GNU Texinfo (in order to install the info documentation) and a shell sh-compatible.

Numdiff has been successfully compiled and tested on:

  • Slackware® GNU/Linux 10.2 with the version 3.3.6 of the GNU C Compiler (GCC),
  • Slackware GNU/Linux 11 with GCC 3.4.6,
  • Slackware GNU/Linux 12.2 with GCC 4.2.4,
  • Slackware GNU/Linux 13 with GCC 4.3.3,
  • Debian® GNU/Linux 4.0 with GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21),
  • Debian GNU/Linux 6.0.3 with GCC 4.4.5 (Debian 4.4.5-8),
  • Debian GNU/Linux 7.1 with GCC 4.7.2 (Debian 4.7.2-5),
  • Debian GNU/Linux 8.6 with GCC 4.9.2 (Debian 4.9.2-10),
  • SunOS® 5.8 with GCC 2.95.3, and
  • SunOS 5.10 (i386) with the version 5.9 of the Sun C compiler.

Configuration, building and installation of Numdiff can be performed through the standard three steps:

        ./configure
        make
        make install

If you leave enabled the Natural Language Support and you also want to install the localization files (at the moment only the Italian localization is supplied), then after ‘make’ you will have to type and run

        make install-nls

By default, ‘make install’ will install all the files in /usr/local/bin, /usr/local/info etc. You can specify an installation prefix other than /usr/local using the option --prefix in the configure step, for instance ‘--prefix=$HOME’:

        ./configure --prefix=$HOME

For better control, you can use the options --bindir, --infodir, and so on. Type ‘./configure --help’ to obtain the complete list of all available options.

The documentation files (including a full User Manual available in HTML, PDF and plain ASCII text format) will always be put in DOCDIR/numdiff, where DOCDIR is the path specified by the option --docdir or, if this option has not been given to configure, PREFIX/local/doc. Here PREFIX is the installation prefix specified by the option --prefix or the default /usr/local.

Once Numdiff has been installed you can remove all files related to Numdiff by a simple ‘make uninstall’. If you have also installed the localization files trough ‘make install-nls’, use ‘make uninstall-nls’ in place of ‘make uninstall’ to remove them too.

Between the options accepted by configure there are --enable-debug, --enable-optimization, --enable-nls and --enable-gmp.

The option --enable-debug turns on debugging when compiling the source code. This is obtained by passing to the compiler the -g option, but you can change this default debugging flag (which could not even be recognized by your compiler) by setting the environment variable DBGFLAGS before launching configure.

The option --enable-optimization turns on basic optimization when compiling the source code. This is obtained by passing to the compiler the -O option, but you can change this default flag (which could not even be recognized by your compiler) by setting the environment variable OPTFLAGS before launching configure.

The option --enable-nls turns on Natural Language Support. You do not need to use it explicitly since Natural Language Support is enabled by default. To disable it, use --disable-nls. Disabling Natural Language Support is suggested whenever you want to install Numdiff on a system where the GNU gettext library is not present. In this case the installation of Numdiff can be accomplished, for example, through

        ./configure --disable-nls
        make
        make install

Since version 5.2.0 Numdiff uses to perform all computations the GNU Multiple Precision Arithmetic Library (also called GNU MP or GMP), if this library is available at build-time. The old internal support for multiple precision arithmetic is a fall-back in case GNU MP is absent. However, it is possible to use the internal support for multiple precision arithmetic even if GNU MP is available: it is sufficient to pass the option --enable-gmp=no or --disable-gmp to the configure script before building the program, like in

        ./configure --disable-gmp
        make
        make install

Enabling the old internal support for multiple precision arithmetic is deprecated, see with GNU MP is better. The latest version of GNU MP is available at http://ftp.gnu.org/gnu/gmp/. See the GNU MP web page at http://gmplib.org/ for up-to-date information on GNU MP.


Next: , Previous: , Up: Top   [Contents][Index]

5 Invoking numdiff

SYNOPSIS

   numdiff -h|--help|-v|--version

or

   numdiff [-s IFS][-D DELIMS][-a THRVAL[:RANGE|:RANGE1:RANGE2]]
   [-r THRVAL[:RANGE|:RANGE1:RANGE2]][-2][-F NUM][-# NUM][-P][-N][-I]
   [-c CURRNAME][-d C1C2][-t C1C2][-g N1N2][-p C1C2][-n C1C2][-e C1C2]
   [-i C1C2][-X 1:RANGE][-X 2:RANGE][-E][-U][-b][-V][-O[NUM]][--raw][-q][-S]
   [-z 1:RANGE][-z 2:RANGE][-Z 1:RANGE][-Z 2:RANGE][-m][-H][-f[NUM]]
   [-T][-B][-l PATH][-o PATH] FILE1 FILE2

where FILE1 and FILE2 are the names of the two files to compare and RANGE, RANGE1 and RANGE2 stay for a positive integer value or for a range of integer values, like ‘1-’, ‘3-5’ or ‘-7’.

In the first case numdiff prints a short help (not so short actually :)) or/and version number, Copyright, License notice, NO-Warranty disclaimer, and some information about the way it was built. In the second case numdiff compares the files specified by the two mandatory arguments which follow the list of the options. The complete paths of the files should be given, a directory name is not accepted. In addition, the two arguments cannot refer to the same file but one of them can be -, which refers to stdin.

OPTIONS

-s, --separators=IFS

Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline). If IFS is prefixed with ‘1:’ or ‘2:’, use the given delimiter set only for the lines from the first or the second file respectively

-D, --delimiters=DELIMS

Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline). If DELIMS is prefixed with ‘1:’ or ‘2:’, use the given delimiter set only for the lines from the first or the second file respectively

-a, --absolute-tolerance=THRVAL[:RANGE|:RANGE1:RANGE2]

Set to THRVAL the maximum absolute difference permitted before two numeric fields are regarded as different (The default value is zero). If a RANGE is given, use the specified threshold only when comparing fields whose indexes lie in RANGE. If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2

-r, --relative-tolerance=THRVAL[:RANGE|:RANGE1:RANGE2]

Set to THRVAL the maximum relative difference permitted before two numeric fields are regarded as different (The default value is zero). If a RANGE is given, use the specified threshold only when comparing fields whose indexes lie in RANGE. If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2

-2, --strict

Consider two numerical values as equal only if both absolute and relative difference do not exceed the respective tolerance threshold

-F, --formula=NUM

Use the formula indicated by NUM to compute the relative errors. If NUM is 0 use the classic formula. If NUM is 1 compute the relative errors by considering the values in FILE1 as sample values. If NUM is 2 compute the relative errors by considering the values in FILE2 as sample values.

-#, --digits=NUM

Set to NUM the number of digits in the significands used in multiple precision arithmetic

-P, --positive-differences

Ignore all differences due to numeric fields of the second file that are less than the corresponding numeric fields in the first file

-N, --negative-differences

Ignore all differences due to numeric fields of the second file that are greater than the corresponding numeric fields in the first file

-I, --ignore-case

Ignore changes in case while doing literal comparisons

-c, --currency=CURRNAME

Set to CURRNAME the currency name for the two files to compare. CURRNAME must be prefixed with ‘1:’ or ‘2:’ to specify the currency name only for the first or the second file

-d, --decimal-point=C1C2

Specify the characters representing the decimal point in the two files to compare

-t, --thousands-separator=C1C2

Specify the characters representing the thousands separator in the two files to compare

-g, --group-length=N1N2

Specify the number of digits forming each group of thousands in the two files to compare

-p, --plus-prefix=C1C2

Specify the (optional) prefixes for positive values used in the two files to compare

-n, --minus-prefix=C1C2

Specify the prefixes for negative values used in the two files to compare

-e, --exponent-letter=C1C2

Specify the exponent letters used in the two files to compare

-i, --imaginary-unit=C1C2

Specify the characters representing the imaginary unit in the two files to compare

-X, --exclude=1:RANGE

Select the fields of the first file that have to be ignored

-X, --exclude=2:RANGE

Select the fields of the second file that have to be ignored

-E, --essential

While printing the differences between the two compared files show only the numerical ones

-U, --dummy

While printing the differences between the two compared files neglect all the numerical ones (dummy mode)

-b, --brief

Suppress all messages concerning the differences discovered in the structures of the two files

-V, --verbose

For every couple of lines which differ in at least one field print an header to show how these lines appear in the two compared files

-O, --overview[=NUM]

Display a side by side difference listing of the two files showing which lines are present only in one file, which lines are present in both files but with one or more differing fields, and which lines are identical. If NUM is zero or is not specified, output at most 130 columns per line. If NUM is a positive number, output at most NUM columns per line. If NUM is a negative number, do not output common lines and display at most -NUM columns per line.

--raw

Display the differences between the two compared files in raw format (not very convenient for humans)

-q, --quiet, --silent

Suppress all the standard output

-S, --statistics

Add some statistics to the standard output

-z, --blur-if-numerical=1:RANGE

Select the fields of the first file that have to be blurred during the synchronization procedure only if they turn out to be numeric

-z, --blur-if-numerical=2:RANGE

Select the fields of the second file that have to be blurred during the synchronization procedure only if they turn out to be numeric

-Z, --blur-unconditionally=1:RANGE

Select the fields of the first file that have to be unconditionally blurred during the synchronization procedure

-Z, --blur-unconditionally=2:RANGE

Select the fields of the second file that have to be unconditionally blurred during the synchronization procedure

-m, --minimal

During synchronization try hard to find a smaller set of changes

-H, --speed-large-files

During synchronization assume large files and many scattered small changes

-f, --test-filter[=NUM]

Run only the filter and then show the results of its attempt to synchronize the two files. If NUM is zero or is not specified, output at most 130 columns per line. If NUM is a positive number, output at most NUM columns per line. If NUM is a negative number, do not output common lines and display at most -NUM columns per line.

-T, --expand-tabs

Expand tabs to spaces in output while displaying the results of the synchronization procedure (meaningful only together with option -O or -f)

-B, --binary

Treat both files as binary files (only meaningful under Doz/Windoz)

-l, --warnings-to=PATH

Redirect warning and error messages from stderr to the indicated file

-o, --output=PATH

Redirect output from stdout to the indicated file

-h, --help

Show help message and predefined settings

-v, --version

Show version number, Copyright, Distribution Terms and NO-Warranty

DIAGNOSTICS

The exit status is 1 if the two given files differ, 0 if they are equal, -1 (255) in case of error.

DEFAULT NUMERIC FORMAT (for both files to compare):

Currency name = ""


Decimal point = ‘.’


Thousands separator = ‘,’


Number of digits in each thousands group = 3


Leading positive sign = ‘+’


Leading negative sign = ‘-’


Prefix for decimal exponent = ‘e’


Symbol used to denote the imaginary unit = ‘i’

SOME EXPLANATIONS

The options -U, -E, -b, and -q are used to hide part of the standard output of the program according to certain rules.

The option -U triggers the dummy mode. In this mode numdiff does not print the numerical differences. A numerical difference occurs whenever the compared fields turn out to be both of numerical type, but the field from the second file has a value which differs from the one of the field from the first file. The dummy mode is so called since in this mode numdiff does not perform the job for which I created it.

The option -E triggers the essential mode. In this mode numdiff only prints the numerical differences between the files and, if there are some, the differences in the structure. The latter ones occur either when one of the files contains a line for which there is no corresponding line in the other file, or when the comparison of corresponding lines shows that one of them contains a field for which there exists no corresponding field in the other line. If you are not running any filter or cutting out any fields through the option -X, then the differences in the structure simply consist either in a different number of lines in the two files, or in a different number of fields on a line.

The option -b triggers the brief mode. In this mode numdiff does not print the differences in the structure of the two files (see above for an explanation about what differences in the structure are).

The option -q triggers the quiet mode. In this mode numdiff does not print anything on the standard output. The quiet mode is useful if you only want to know whether a couple of files are equal or not. This information can be obtained by looking at the exit status of the program.

The option -O activates the overview mode, which makes numdiff print a side-by-side report in the form described in section Overview mode. The optional numeric argument after -O must immediately follow, intermediate spaces are not allowed. The option -O can be used together with any other option of Numdiff except for -f, -q, -U, -E, -V, -b, and --raw. Whenever -O is in use, -U, -E, -V and -b are ignored. If --raw or -q is present on the command line together with -O, then -O is ignored. Finally, if both -f and -O are present, the behavior of Numdiff will depend on their order: the option which appears first on the command line is the one which matters.

The option -V triggers the verbose mode. In this mode numdiff produces a richer report by printing an header whenever the compared lines differ. The header shows how and where these lines appear in the compared files. For instance, if the files data1 and data2 contain the data

12      33
22      44.5
0.008   1.002
221.12  -34.56  water
2101.21 boats

and

12      33
22.3      44.5
0.008   1.202
221.12  -34.56
2101.21 boats   dogs

respectively, then the command ‘numdiff -V data1 data2’ will print the following output:

----------------
##2       <== 22      44.5
##2       ==> 22.3      44.5

##2       #:1   <== 22
##2       #:1   ==> 22.3
@ Absolute error = 3.0000000000e-1, Relative error = 1.3636363636e-2
----------------
##3       <== 0.008   1.002
##3       ==> 0.008   1.202

##3       #:2   <== 1.002
##3       #:2   ==> 1.202
@ Absolute error = 2.0000000000e-1, Relative error = 1.9960079840e-1
----------------
##4       <== 221.12  -34.56  water
##4       ==> 221.12  -34.56

##4       #>3   <== water
##4             ==>
@ Line 4 in file "data2" is shorter than expected!
----------------
##5       <== 2101.21 boats
##5       ==> 2101.21 boats   dogs

##5             <==
##5       #>3   ==> dogs
@ Line 5 in file "data1" is shorter than expected!

+++  File "data1" differs from file "data2"

Mind that the options -b and -V will be overridden if -q is also set.

The amount of additional information printed by -V is trivially influenced by the options that alter the way numdiff performs the comparisons between fields (for instance -a, -r, -2, -N, -P, -U, -E, -I, -X).

In the headers printed by numdiff in “verbose mode” the symbol <<*>> can appear. This symbol, if present, is always located at the end of a line to mean that the line is at the end of the corresponding file and does not have a terminating newline character.

The option -S adds to the standard output of numdiff a statistical report with the following information:

  • the number of numeric comparisons the program has done (this quantity, like the successive ones, is influenced by the options -P and -N) and the number of those ones whose outcome is a major 1 numerical difference.
  • the largest absolute error in the set of major numerical differences together with the corresponding relative error, and the positions of its first occurrences in the compared files,
  • the largest relative error in the set of major numerical differences together with the corresponding absolute error, and the positions of its first occurrences in the compared files,
  • the sum and the arithmetic mean of all absolute errors,
  • the sum and the arithmetic mean of the major absolute errors,
  • the square root of the sum of the squares of all absolute errors,
  • the square root of the sum of the squares of the major absolute errors,
  • the quadratic mean of all absolute errors, and
  • the quadratic mean of the major absolute errors.

The information printed by -S is not removed if this option is used together with -q, and is not influenced by the option --raw.

The options -a, -r, -2, -P and -N affect the way numdiff performs the comparisons between numerical values. Without any of these options, numdiff considers two numerical fields as equal if their difference is zero.

The option -a can be used to make two numerical fields be considered equal as long as their absolute difference does not exceed a certain threshold, which is specified by the argument that follows the -a option. This argument can take several forms. The basic form consists of a single numerical value, the extended form adds the specification of one or two ranges of integer values.

Independently of the form of the argument, if the absolute difference between two fields does not exceed the given threshold value, the fields are considered equal; otherwise, numdiff prints the difference in its report, unless some other option, for example -P or -N, makes the difference be neglected. If nothing else follows the threshold value, the rule just explained applies to all comparisons between numerical fields. To see this in practice, if the file many_columns1 contains the text

A	1	 1.2	  1	 0.1	  11.0         1.0e-1
B	2        2.4      4      0.4      24.0         1.0e-2
C	3        3.6      9      0.9      39.0         1.0e-3
D	4	 4.8     16      1.6     416.0         1.0e-4

and the contents of the file many_columns2 are given by

A	1.1	1.08	 1.01	 0.1	 11.011        -1.0e-1
B	2.2     2.16     4.04    0.4     24.024        -1.0e-2
C	3.3     3.24     9.09    0.9     39.039        -1.0e-3
D	4.4	4.32    16.16    1.6    416.039        -1.0e-4

then the output of the command ‘numdiff -a 0.5 many_columns1 many_columns2’ will be

+++  Files "many_columns1" and "many_columns2" are equal

The highest absolute difference between a field from many_columns1 and the corresponding field from many_columns2 is given indeed by |4.32 - 4.8| = |-0.48| = 0.48, and then all numeric differences between the two files remain below the threshold value 0.5.

On the other hand, the command ‘numdiff -a 0.35 many_columns1 many_columns2’ prints the report

----------------
##3       #:3   <== 3.6
##3       #:3   ==> 3.24
 Absolute error = 3.6000000000e-1, Relative error = 1.1111111111e-1
----------------
##4       #:2   <== 4
##4       #:2   ==> 4.4
 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1
##4       #:3   <== 4.8
##4       #:3   ==> 4.32
 Absolute error = 4.8000000000e-1, Relative error = 1.1111111111e-1

+++  File "many_columns1" differs from file "many_columns2"

since the absolute differences |3.24-3.6| = |-0.36| = 0.36, |4.4-4| = |0.4| = 0.4, and |4.32 - 4.8| = 0.48 exceed the value 0.35, while the other differences are below this threshold.

If you want that the specified threshold value applies only when comparing some particular fields, you have to use the extended form for the argument of -a. This means that after the threshold value one or two ranges of integer numbers must follow, each preceded by a colon (‘:’). If you specify only one range of numbers after the threshold value, numdiff uses the given threshold only when comparing fields whose positions lie in the specified range. Remember that the positions of the fields on a line are numbered starting from the left hand of the line and proceeding towards the right hand. For example, ‘-a 0.01:2-5’ sets the threshold value to 0.01 only for the comparisons between numerical fields which occupy on their lines a position between the second and the fifth one inclusive. For the other comparisons the threshold value is left unchanged; in particular, it is equal to zero if it has not been explicitly set. If the files many_columns1 and many_columns2 are the same as before, then the command ‘numdiff -a 0.5:3-6 many_columns1 many_columns2’ will display the following report

----------------
##1       #:2   <== 1
##1       #:2   ==> 1.1
 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1
##1       #:7   <== 1.0e-1
##1       #:7   ==> -1.0e-1
 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0
----------------
##2       #:2   <== 2
##2       #:2   ==> 2.2
 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1
##2       #:7   <== 1.0e-2
##2       #:7   ==> -1.0e-2
 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0
----------------
##3       #:2   <== 3
##3       #:2   ==> 3.3
 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1
##3       #:7   <== 1.0e-3
##3       #:7   ==> -1.0e-3
 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0
----------------
##4       #:2   <== 4
##4       #:2   ==> 4.4
 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1
##4       #:7   <== 1.0e-4
##4       #:7   ==> -1.0e-4
 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0

+++  File "many_columns1" differs from file "many_columns2"

since the threshold value 0.5 applies now only when comparing fields in third, fourth, fifth and sixth position, while for the other comparisons the threshold value is the default one, i.e. zero. If you want to specify a non null threshold also for the fields in second and seventh position, you can do it by using the option -a more times. The command ‘numdiff -a 0.5:3-6 -a 0.25:2 -a 4e-3:7 many_columns1 many_columns2’ sets the threshold value to 0.25 for the comparisons between the fields in second position, and to 4e-3 for the comparisons of the fields in seventh position. No wonder then, that the command prints exactly this report:

----------------
##1       #:7   <== 1.0e-1
##1       #:7   ==> -1.0e-1
 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0
----------------
##2       #:7   <== 1.0e-2
##2       #:7   ==> -1.0e-2
 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0
----------------
##3       #:2   <== 3
##3       #:2   ==> 3.3
 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1
----------------
##4       #:2   <== 4
##4       #:2   ==> 4.4
 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1

+++  File "many_columns1" differs from file "many_columns2"

Observe that :2 and :7 are abbreviations of :2-2 and :7-7, respectively. It is even possible to use range expressions like ‘m-’ or ‘-n’. The first expression means all fields starting from the mth one (inclusive) till to the end of line, the second selects all fields from the first one till to the nth one, both inclusive.

If you specify two ranges of numbers after the threshold value and they have the same length (the length of a range is the difference between its maximum and its minimum), numdiff uses the given threshold when comparing a field of the first file lying in the first range with the corresponding field of the second file from the second range. For example, ‘-a 1e-4:3-5:4-6’ sets the threshold value to 0.0001 only for the numerical comparisons of the third, fourth, and fifth field of each line from the first file with the fourth, fifth and sixth field respectively of the corresponding line from the second file. For the other comparisons the threshold value is left unchanged and is in particular equal to zero if it has not been explicitly set. This way to restrict the application of a threshold value is useful in conjunction with the option -X, which makes numdiff ignore one or more fields from one of the compared files.

The file many_columns3:

A    I	1.1	1.08	 1.01	 0.1	 11.011        -1.0e-1
B   II	2.2     2.16     4.04    0.4     24.024        -1.0e-2
C  III	3.3     3.24     9.09    0.9     39.039        -1.0e-3
D   IV	4.4	4.32    16.16    1.6    416.039        -1.0e-4

has one column more than the file many_columns1, namely the second one. When comparing many_columns1 with many_columns3 it is natural then to ignore the second column of the second file. This can be achieved by passing the argument 2:2 to the option -X (for a full description of the use of this option, see Restriction of the comparison to particular fields). Ignoring the second field of each line of many_columns3 implies that the fields in the third column of this file are compared with the corresponding fields of the second column of many_columns1, the fields in the fourth column of many_columns3 are compared with the ones in the third column of many_columns1, and so on. Therefore, if you want to set a threshold value only for the comparisons between some particular fields you have to consider that ‘-X 2:2’ makes numdiff compare the first, second, third, fourth, fifth, sixth, and seventh field of each line of many_columns1 with the first, third, fourth, fifth, sixth, seventh, and eighth field respectively of the corresponding line of many_columns3. Therefore, the command ‘numdiff -X 2:2 -a 0.5:3-6 many_columns1 many_columns3’ will use 0.5 as threshold value only when comparing the third, fourth, and fifth field of a line from many_columns1 with the fourth, fifth, and sixth field respectively of the corresponding line of many_columns3. This explains why the report of ‘numdiff -X 2:2 -a 0.5:3-6 many_columns1 many_columns3

----------------
##1       #:2   <== 1
##1       #:3   ==> 1.1
 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1
##1       #:6   <== 11.0
##1       #:7   ==> 11.011
 Absolute error = 1.1000000000e-2, Relative error = 1.0000000000e-3
##1       #:7   <== 1.0e-1
##1       #:8   ==> -1.0e-1
 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0
----------------
##2       #:2   <== 2
##2       #:3   ==> 2.2
 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1
##2       #:6   <== 24.0
##2       #:7   ==> 24.024
 Absolute error = 2.4000000000e-2, Relative error = 1.0000000000e-3
##2       #:7   <== 1.0e-2
##2       #:8   ==> -1.0e-2
 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0
----------------
##3       #:2   <== 3
##3       #:3   ==> 3.3
 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1
##3       #:6   <== 39.0
##3       #:7   ==> 39.039
 Absolute error = 3.9000000000e-2, Relative error = 1.0000000000e-3
##3       #:7   <== 1.0e-3
##3       #:8   ==> -1.0e-3
 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0
----------------
##4       #:2   <== 4
##4       #:3   ==> 4.4
 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1
##4       #:6   <== 416.0
##4       #:7   ==> 416.039
 Absolute error = 3.9000000000e-2, Relative error = 9.3750000000e-5
##4       #:7   <== 1.0e-4
##4       #:8   ==> -1.0e-4
 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0

+++  File "many_columns1" differs from file "many_columns3"

does not show the same difference listing of the command ‘numdiff -a 0.5:3-6 many_columns1 many_columns2’.

If what you want is to obtain the same difference listing of ‘numdiff -a 0.5:3-6 many_columns1 many_columns2’, then the right command is ‘numdiff -X 2:2 -a 0.5:3-6:4-7 many_columns1 many_columns3’. The report printed by this last command is indeed

----------------
##1       #:2   <== 1
##1       #:3   ==> 1.1
 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1
##1       #:7   <== 1.0e-1
##1       #:8   ==> -1.0e-1
 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0
----------------
##2       #:2   <== 2
##2       #:3   ==> 2.2
 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1
##2       #:7   <== 1.0e-2
##2       #:8   ==> -1.0e-2
 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0
----------------
##3       #:2   <== 3
##3       #:3   ==> 3.3
 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1
##3       #:7   <== 1.0e-3
##3       #:8   ==> -1.0e-3
 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0
----------------
##4       #:2   <== 4
##4       #:3   ==> 4.4
 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1
##4       #:7   <== 1.0e-4
##4       #:8   ==> -1.0e-4
 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0

+++  File "many_columns1" differs from file "many_columns3"

and up to the positions of the fields from many_columns3 coincides with the one of ‘numdiff -a 0.5:3-6 many_columns1 many_columns2’.

The option -a can appear more times on the command line. In case of conflicts, the last setting is the one which matters. If you look at the report of the command ‘numdiff -a 0.5:3-6 -a 0.08:4 many_columns1 many_columns2

----------------
##1       #:2   <== 1
##1       #:2   ==> 1.1
 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1
##1       #:7   <== 1.0e-1
##1       #:7   ==> -1.0e-1
 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0
----------------
##2       #:2   <== 2
##2       #:2   ==> 2.2
 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1
##2       #:7   <== 1.0e-2
##2       #:7   ==> -1.0e-2
 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0
----------------
##3       #:2   <== 3
##3       #:2   ==> 3.3
 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1
##3       #:4   <== 9
##3       #:4   ==> 9.09
 Absolute error = 9.0000000000e-2, Relative error = 1.0000000000e-2
##3       #:7   <== 1.0e-3
##3       #:7   ==> -1.0e-3
 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0
----------------
##4       #:2   <== 4
##4       #:2   ==> 4.4
 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1
##4       #:4   <== 16
##4       #:4   ==> 16.16
 Absolute error = 1.6000000000e-1, Relative error = 1.0000000000e-2
##4       #:7   <== 1.0e-4
##4       #:7   ==> -1.0e-4
 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0

+++  File "many_columns1" differs from file "many_columns2"

you see that 0.08 and not 0.5 is taken as threshold value for the comparison of the fields in fourth position.

Finally, if -a is not present on the command line, then the default threshold value of zero applies to all comparisons of numerical fields and any non null absolute difference is considered as significant, unless some other option, for example -P or -N, makes numdiff ignore it.

The option -r can be used to make two numerical fields be considered equal as long as their relative difference does not exceed a certain threshold, which is specified by the argument that follows the -r option. As for the option -a, the argument of -r can have several forms. These forms are the same accepted by -a and have the same meanings, but the threshold value applies to the relative difference, not to the absolute one.

The relative difference is normally defined in this way. If n1 is a value from the file specified as first on the command line and n2 is the corresponding value from the second file, then the absolute difference is given by the formula A=|n1-n2|. The relative difference R is given by:

  • R = 0 if n1 and n2 are equal,
  • Inf (infinity) if n2 differs from n1 and at least one of them is zero,
  • R = A/ min(|n1|, |n2|) if n1 and n2 are both non zero and n2 differs from n1. min(|n1|, |n2|) denotes the minimum between the absolute value of n1 and the absolute value of n2.

With this definition of relative difference it turns out that R(n2, n1) = R(n1, n2): the relative difference does not change if you only change the ordering of the compared files on the command line.

There are cases when this default definition of relative error makes no sense. This can happen for instance when one of the files is a sample file containing a list of expected data, which could have been computed theoretically or come from experiments in a laboratory. In this case it is more natural to define the relative difference as the ratio between the absolute difference and the absolute value of the number coming from the sample file. If you use the option -F together with the argument 1 (or 2), then Numdiff always compute the relative difference as the ratio between the absolute difference and the absolute value of the number from the first file (the second file, respectively). More precisely, with ‘-F 1’ the relative difference R is computed according to these rules:

  • R = 0 if n1 and n2 are equal,
  • Inf (infinity) if n2 differs from n1 and n1 is zero,
  • R = |n1-n2|/ |n1| if n1 is not zero and n2 differs from n1.

With ‘-F 2’ the rules become:

  • R = 0 if n1 and n2 are equal,
  • Inf (infinity) if n2 differs from n1 and n2 is zero,
  • R = |n1-n2|/ |n2| if n2 is not zero and n2 differs from n1.

With the last two sets of rules it is not anymore true that R(n2, n1) = R(n1, n2): the relative difference changes, in the general case, together with the ordering of the files on the command line. As a simple example, suppose that file1 and file2 contain

1    9.9  0.5  440

and

1.2  8    0.51 400 

respectively. Then ‘numdiff file1 file2’ displays

----------------
##1       #:1   <== 1
##1       #:1   ==> 1.2
 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1
##1       #:2   <== 9.9
##1       #:2   ==> 8
 Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1
##1       #:3   <== 0.5
##1       #:3   ==> 0.51
 Absolute error = 1.0000000000e-2, Relative error = 2.0000000000e-2
##1       #:4   <== 440
##1       #:4   ==> 400
 Absolute error = 4.0000000000e+1, Relative error = 1.0000000000e-1

+++  File "file1" differs from file "file2"

numdiff -F 1 file1 file2’ prints

----------------
##1       #:1   <== 1
##1       #:1   ==> 1.2
 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1
##1       #:2   <== 9.9
##1       #:2   ==> 8
 Absolute error = 1.9000000000e+0, Relative error = 1.9191919192e-1
##1       #:3   <== 0.5
##1       #:3   ==> 0.51
 Absolute error = 1.0000000000e-2, Relative error = 2.0000000000e-2
##1       #:4   <== 440
##1       #:4   ==> 400
 Absolute error = 4.0000000000e+1, Relative error = 9.0909090909e-2

+++  File "file1" differs from file "file2"

the output of ‘numdiff -F 2 file1 file2’ is

----------------
##1       #:1   <== 1
##1       #:1   ==> 1.2
 Absolute error = 2.0000000000e-1, Relative error = 1.6666666667e-1
##1       #:2   <== 9.9
##1       #:2   ==> 8
 Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1
##1       #:3   <== 0.5
##1       #:3   ==> 0.51
 Absolute error = 1.0000000000e-2, Relative error = 1.9607843137e-2
##1       #:4   <== 440
##1       #:4   ==> 400
 Absolute error = 4.0000000000e+1, Relative error = 1.0000000000e-1

+++  File "file1" differs from file "file2"

numdiff -F 1 -r 0.195 file1 file2’ displays

----------------
##1       #:1   <== 1
##1       #:1   ==> 1.2
 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1

+++  File "file1" differs from file "file2"

and finally, ‘numdiff -F 2 -r 0.195 file1 file2’ displays

----------------
##1       #:2   <== 9.9
##1       #:2   ==> 8
 Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1

+++  File "file1" differs from file "file2"

The option -2 is only meaningful when the user specifies a non-zero tolerance threshold for both absolute and relative difference. Without this option numdiff considers two numerical fields equal as long as at least one between absolute and relative difference does not exceed the corresponding threshold. With the option -2 numdiff regards two numerical fields as equal only if both absolute and relative difference do not exceed the thresholds of tolerance specified for those fields. For example, if file1 contains the unique line

100

and file2 the line

100.00012

then the output of the command ‘numdiff file1 file2’ will be

----------------
##1       #:1   <== 100
                ==> 100.00012
@ Absolute error = 1.2000000000e-4, Relative error = 1.2000000000e-6

+++  File "file1" differs from file "file2"

The output of the commands ‘numdiff -a 1.0e-4 file1 file2’ and ‘numdiff -r 1.0e-6 file1 file2’ will be the same as above, but ‘numdiff -a 1.0e-4 -r 1.3e-6 file1 file2’ and ‘numdiff -a 1.3e-4 -r 1.0e-6 file1 file2’ will print the message

+++  Files "file1" and "file2" are equal

since the relative difference is 1.2e-6 < 1.3e-6, the absolute difference is 1.2e-4 < 1.3e-4, and it is sufficient that one of them does not exceed its tolerance threshold.

On the other hand, the commands ‘numdiff -a 1.0e-4 -r 1.3e-6 -2 file1 file2’ and ‘numdiff -a 1.3e-4 -r 1.0e-6 -2 file1 file2’ will both print the message

----------------
##1       #:1   <== 100
                ==> 100.00012
@ Absolute error = 1.2000000000e-4, Relative error = 1.2000000000e-6

+++  File "file1" differs from file "file2"

since the option -2 makes numdiff regard two values as equal only if both absolute and relative difference do not exceed the respective threshold of tolerance.

The option -P makes numdiff consider two values equal whenever the second one, i.e. the value coming from the file specified as last on the command line, is less or equal than the first one, which is the value coming from the file specified as first on the command line. If the values to compare are complex numbers, saying that the second one is less or equal than the first one means that both real and imaginary part of the second value are not greater than real and imaginary part of the first value, respectively.

Finally, the option -N makes numdiff consider two values equal whenever the second one, i.e. the value coming from the file specified as last on the command line, is greater or equal than the first one, which is the value coming from the file specified as first on the command line. If the values to compare are complex numbers, saying that the second one is greater or equal than the first one means that both real and imaginary part of the second value are not less than real and imaginary part of the first value, respectively.

The options -B, -I, -l, -o, -h, and -v do not require further explanations. The options -l and -o are only supplied for the users of poorly designed operating systems, whose default shell does not allow the redirection of standard error and standard output. The option -I has no effect on the outcome of numerical comparisons but affects the action of the filter, see Filtering.

The option -s requires as argument a set of characters, which will be taken as field delimiters. It is better to quote the set of the delimiters, just as in the next examples:

numdiff -s ' \t\n,;:.' file1 file2
numdiff -s ' \t\n\r\f\v"\:;' file1 file2
numdiff -s `` \t\n''' file1 file2

If you want to include in the set of delimiters also some special characters, e.g. the blank, then you must quote it. I recommend you to always use the single quote character (') to enclose the list of the delimiters, since in this way you will prevent any substitution or handling of characters by the shell.

numdiff recognizes and interprets the following sequences of characters within the argument passed to the option -s:

  • \a’ alert (bell),
  • \b’ backspace,
  • \f’ form feed,
  • \n’ newline,
  • \r’ carriage return,
  • \s’ blank,
  • \t’ horizontal tab,
  • \v’ vertical tab,
  • \\’ backslash,
  • \nnn’ the eight-bit character whose value is the octal value nnn (one to three digits),
  • \xHH’ the eight-bit character whose value is the hexadecimal value HH (one or two digits).

Thus, by passing the string ‘ \t\n,;:.’ as argument for the option -s one tells numdiff to use as field delimiters the characters blank, horizontal tab, newline, comma, semicolon, colon, and dot. Passing ‘ \t\n’ as argument to the option -s is the same as not using at all the option -s, since blank, horizontal tab, and newline are the default field delimiters.

In the list of field delimiters the character backslash (‘\’) is always treated in a special way. If it forms, combined with the subsequent character(s), one of the escape sequences listed above, then it is considered to be an escape character, and the whole escape sequence is decoded as shown above. Otherwise, the backslash is just ignored.

Therefore, the delimiters specified by the command line

numdiff -s' \t\n\\\"' file1 file2

are blank, horizontal tab, newline, backslash and double quote, since ‘\\’ and ‘\"’ are interpreted by numdiff as ‘\’ and ‘"’.

Even if I have recommended to enclose the set of delimiters in single quotes, there are cases in which you will be forced to use the double quote character (‘"’) to enclose the set of field delimiters, e.g. if the single quote character is used itself as field delimiter, like in one of the precedent examples. However, you must take into account that in this case the shell could make some substitutions on the command line before executing numdiff. For instance, if your shell is GNU bash, then (citing the man page of GNU bash)

Enclosing characters in double quotes preserves the literal value of all characters within the quotes, with the exception of ‘$’, ‘`’, and ‘\’. The characters ‘$’ and ‘`’ retain their special meaning within double quotes. The backslash retains its special meaning only when followed by one of the following characters: ‘$’, ‘`’, ‘"’, ‘\’, or <newline>. A double quote may be quoted within double quotes by preceding it with a backslash ... The special parameters * and @ have special meaning when in double quotes …

Therefore, if the set of delimiters is formed by ‘ ’, ‘\t’, ‘\n’, ‘\’ and ‘"’, and you decide to enclose them in double quotes, the numdiff command line should be

numdiff -s'' \t\n\\\\\"'' file1 file2

and not

numdiff -s'' \t\n\\\"'' file1 file2

In the latter case the shell would indeed replace the string

\t\n\\\"

by

\t\n\"

and then numdiff would take ‘ ’, ‘\t’, ‘\n’ and ‘"’ as field delimiters.

numdiff requires the presence of the newline in the set of characters passed to -s. The absence of the newline in the set of delimiters causes the issue of a warning message and the termination of the program.

If you run Numdiff with the option -B (--binary) on files created under MSDog/MSWindoze, then you should put the carriage return in the set of field delimiters. Otherwise, this character would be included in all the fields which stay at the end of a line and this would cause some undesirable effects. For instance, a number put at the end of a line would not be regarded as a numerical field by numdiff, since numdiff would consider the final carriage return as part of the field, and this one would be then qualified as non-numerical.

You can specify different delimiters for the two files to compare by putting the prefix ‘1:’ or ‘2:’ in front of the set of characters passed to -s. If the argument of -s begins with ‘1:’, the characters after this prefix are used as field delimiters only for the file passed as first on the command line. Analogously, if the prefix is ‘2:’, then the characters after it are used as field delimiters only for the file specified as second on the command line. You can also provide an explicit set of delimiters for just one of the files to compare, in which case numdiff uses the default field delimiters blank, tab and newline for the other file. Therefore, with ‘numdiff -s '1:: \n' file1 file2’ the program will take colon, blank and newline as delimiters for file1, and blank, tab and newline as delimiters for file2. The recommendations about quoting the set of delimiters are valid also in presence of a prefix.

Starting from version 5.8 numdiff allows to specify whole strings as field delimiters instead of single characters. To this purpose the option -D is provided. Assume that file register1 and file register2 contain

--A:    +1.0---
--B:    -2.0---
--C:    +3.0---
--D:    -4.0---
--E:    +5.0---
--F:    -6.0---

and

--a:    +1.1---
--b:    -2.2---
--c:    +3.3---
--d:    -4.4---
--e:    +5.5---
--f:    -6.6---

respectively. Assume in addition, you would like that the dashes at the begin and at the end of every line are treated as delimiters and then neglected during the line by line comparison. To obtain this you cannot just specify the character - (minus) as delimiter via the option -s: if you do it, the negative numbers appearing in the two files will be treated as positive, since the minus sign will be regarded as a delimiter. By means of the option -D you can tell numdiff to consider the strings -- and --- as field delimiters, but not the single character -. To see this in practice, look at the output of the command ‘numdiff -D ': -- --- \s \n' register1 register2’:

----------------
##1       #:1   <== A
##1       #:1   ==> a
                                                     @
##1       #:2   <== +1.0
##1       #:2   ==> +1.1
 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1
----------------
##2       #:1   <== B
##2       #:1   ==> b
                                                     @
##2       #:2   <== -2.0
##2       #:2   ==> -2.2
 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1
----------------
##3       #:1   <== C
##3       #:1   ==> c
                                                     @
##3       #:2   <== +3.0
##3       #:2   ==> +3.3
 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1
----------------
##4       #:1   <== D
##4       #:1   ==> d
                                                     @
##4       #:2   <== -4.0
##4       #:2   ==> -4.4
 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1
----------------
##5       #:1   <== E
##5       #:1   ==> e
                                                     @
##5       #:2   <== +5.0
##5       #:2   ==> +5.5
 Absolute error = 5.0000000000e-1, Relative error = 1.0000000000e-1
----------------
##6       #:1   <== F
##6       #:1   ==> f
                                                     @
##6       #:2   <== -6.0
##6       #:2   ==> -6.6
 Absolute error = 6.0000000000e-1, Relative error = 1.0000000000e-1

+++  File "register1" differs from file "register2"

The argument ‘-D ': -- --- \s \n'’ instructs numdiff to regard every occurrence of a colon (:), of a blank (\s), of a newline (\n), as well as every occurrence of the strings -- and --- as field delimiters. The minus sign in front of the negative numbers is then properly handled.

In general the argument to the option -D is a blank separated sequence of one or more strings each of which contains no blank. Thus, the general form of the argument to the option -D is

string1 string2 ... stringN

where string1, string2, and so on are sequences of one or more characters (strings) containing no blank.

Mind that at least one of these strings must be ‘\n’. In addition, if a string contains the newline character, this must be the only one: strings like ‘#\n’, ‘%%\n’, or ‘\s\n’ are not allowed (entering such a string makes the program terminate after issuing a warning message).

Since the blank character has a special meaning for the shell, if the argument of -D is formed by two or more strings it should be quoted either with a single (‘'’) or with a double quote (‘"’). Quoting is also adviced if one of the strings passed to -D contains a character (or a sequence of characters) having a special meaning for the shell.

For the usage of single and double quoting to delimit the argument of -D the same warnings and recommendations apply as for the argument of -s.

If you want to set as delimiter a string which contains one or more blanks, then you have to make use of the escape sequence \s, like in the example above: within the argument of -D the blank character is always interpreted as a separator of adjacent delimiters.

More generally, when writing the argument of -D the same escape sequences are allowed as for the argument of -s. This turns out to be particularly useful whenever a multibyte character is used as delimiter in (one of) the files to compare. As example consider the comparison between ledger1:

             In                            Out

Jan      1200.00€                1000.00€
Feb       800.40€                 650.00€
Mar      1620.50€                1500.00€
Apr       760.00€                 900.00€

Total    4380.90€                4050.00€

Difference: +330.90€

and ledger2:

             In                            Out

Jan      1100.00€                1000.00€
Feb       800.40€                 750.00€
Mar      1620.50€                1700.00€
Apr       750.00€                 900.00€

Total    4270.90€                4350.00€

Difference: -79.10€

Since the Euro symbol is attached to all values, numdiff cannot compare them in the proper way if it is run with the default field delimiters, as the output of the command ‘numdiff ledger1 ledger2’ shows:

----------------
##3       #:2   <== 1200.00€
##3       #:2   ==> 1100.00€
                                                     @
----------------
##4       #:3   <== 650.00€
##4       #:3   ==> 750.00€
                                                     @
----------------
##5       #:3   <== 1500.00€
##5       #:3   ==> 1700.00€
                                                     @
----------------
##6       #:2   <== 760.00€
##6       #:2   ==> 750.00€
                                                     @
----------------
##8       #:2   <== 4380.90€
##8       #:2   ==> 4270.90€
                                                     @
##8       #:3   <== 4050.00€
##8       #:3   ==> 4350.00€
                                                     @
----------------
##10      #:2   <== +330.90€
##10      #:2   ==> -79.10€
                                                     @

+++  File "ledger1" differs from file "ledger2"

The trick to perform the comparison in the proper way consists in specifying the € symbol as field delimiter, in addition to blank, horizontal tabulation and newline. If ledger1 and ledger2 are encoded in UTF-8, this can be done by using the option -D with the argument ‘\xE2\x82\xAC \s \t \n’, since the hexadecimal representation of € in UTF8 is given by the byte sequence 0xE2 0x82 0xAC. On my PC the output of the command ‘numdiff -D '\xE2\x82\xAC \s \t \n' ledger1 ledger2’ shows that with such a choice of the delimiters numdiff performs indeed a numerical comparison of the values contained in the two files:

----------------
##3       #:2   <== 1200.00
##3       #:2   ==> 1100.00
 Absolute error = 1.0000000000e+2, Relative error = 9.0909090909e-2
----------------
##4       #:3   <== 650.00
##4       #:3   ==> 750.00
 Absolute error = 1.0000000000e+2, Relative error = 1.5384615385e-1
----------------
##5       #:3   <== 1500.00
##5       #:3   ==> 1700.00
 Absolute error = 2.0000000000e+2, Relative error = 1.3333333333e-1
----------------
##6       #:2   <== 760.00
##6       #:2   ==> 750.00
 Absolute error = 1.0000000000e+1, Relative error = 1.3333333333e-2
----------------
##8       #:2   <== 4380.90
##8       #:2   ==> 4270.90
 Absolute error = 1.1000000000e+2, Relative error = 2.5755695521e-2
##8       #:3   <== 4050.00
##8       #:3   ==> 4350.00
 Absolute error = 3.0000000000e+2, Relative error = 7.4074074074e-2
----------------
##10      #:2   <== +330.90
##10      #:2   ==> -79.10
 Absolute error = 4.1000000000e+2, Relative error = 5.1833122630e+0

+++  File "ledger1" differs from file "ledger2"

If ledger1 and ledger2 had been saved using a multi-byte encoding different from UTF-8, then the sequence of bytes which corresponds to € in this other encoding should have been passed to -D.

As for -s, with -D you can specify different delimiters for the two files to compare by means of the prefixes ‘1:’ and ‘2:’, like in ‘numdiff -D '1:\t \n' -D '2: -- \s \n' first_file second_file’. The recommendations about quoting the set of delimiters are valid also in presence of a prefix. Mind that, if you provide an explicit set of delimiters for just one of the files to compare, numdiff uses the default field delimiters blank, tab and newline for the other file.

If you run Numdiff with the option -B (--binary) on files created under MSDog/MSWindoze, you should always include the character ‘\r’ in the set of field delimiters.

The option -s and -D can appear more than once on the command line. In case of conflicts, numdiff assumes as set of delimiters for a given file the one specified last on the command line.

By means of the option -# the user can set the number of digits in the significands used in multiple precision arithmetic. The default value is 35, the largest admissible value is 180. If numdiff has been linked against the GNU Multiple Precision Arithmetic Library (also called GNU MP), then the precision it uses is typically higher than the specified one. On my machine the actual value of the precision is 20 if the user requests a value between 0 and 20, 30 if the user specifies a precision between 21 and 30, 40 for a user-specified value between 31 and 40, and so on. Anyway, the actual precision is never less than the one requested by the user.

Take into account that an higher precision makes the execution of numdiff slower. This is particularly true if numdiff is not using the computational routines from the GNU MP library and the files to compare contain a lot of numerical fields. In addition, mind that numdiff truncates the value of a numerical field if it has too much digits with respect to the current precision. To be precise, denoted by P the current value of the precision, the following rules apply.

  • If numdiff has been built with its own internal support for multiple precision arithmetic, then
    • if a number is written in ordinary decimal notation, numdiff will consider, in addition to all digits of the integer part, only the first P digits of the fractional part;
    • if a value is written in scientific notation, then numdiff will only consider the first P digits of the fractional part of the mantissa.
  • If numdiff uses the routines from the GNU MP library to perform its computations, the value of a numerical field is first translated into scientific notation and then only the first P digits of the fractional part of the mantissa are considered.

You can find out whether your local version of numdiff is relying on GNU MP or not by executing the command ‘numdiff -v’. If numdiff uses GNU MP, then this command will display the following message or similar (possibly translated into your mother language) among other information:

The software has been linked against
the GNU Multiple Precision Arithmetic Library,
version number 4.2.4.

If numdiff does not rely on GNU MP, then the displayed message will be (up to translation into your mother language)

The software has been built with
its own internal support for multiple precision arithmetic.

By means of the option -c the user can qualify a string as a symbol or name for a currency. The string passed as argument to this option is ignored whenever it appears immediately before the first digit of a number. In particular, the presence of this string does not prevent a field from being considered of numeric type. By prefixing the argument of -c with ‘1:’ or ‘2:’ it is possible to set the currency name/symbol only for one of the compared files, or to specify different currency names for the two files. As example we consider the files money1:

	Profits			Expenses

	+$430.10		-$300.50
	+$750.20		-$550.02
	+$876.24		-$720.00

Totals  $2056.54               -$1570.52

and money2:

	Profits			Expenses

	USD430.10		-USD300.50
	USD750.20		-USD550.02
	USD876.24		-USD720.15
	
Totals    2056.54                 -1570.67

To properly compare them, we have to tell numdiff that ‘$’ and ‘USD’ are the currency symbols for money1 and money2, respectively. This can be achieved by ‘-c 1:$’ and ‘-c 2:USD’. The output of the command ‘numdiff -c 1:$ -c 2:USD money1 money2’ is

----------------
##5       #:2   <== -$720.00
##5       #:2   ==> -USD720.15
 Absolute error = 1.5000000000e-1, Relative error = 2.0833333333e-4
----------------
##7       #:3   <== -$1570.52
##7       #:3   ==> -1570.67
 Absolute error = 1.5000000000e-1, Relative error = 9.5509767466e-5

+++  File "money1" differs from file "money2"

as it is reasonable to expect.

The argument of -c may also be a multi-byte string, in particular a multi-byte string encoded in UTF-8. If your locale uses UTF-8 as encoding, you can write the argument directly in this form. For instance, you can write ‘-c €’ to specify as currency name the Euro symbol. If your locale does not use UTF-8 as encoding, or UTF-8 is not supported by your terminal, you may still write an UTF-8 encoded string as a multi-byte string by specifying each single byte of every (multi-byte) character. To this purpose you can use the same octal and hexadecimal escape sequences recognized by the options -s and -D, but then the argument of -c has to be quoted to avoid the interpretation of the hexadecimal escape sequences by the shell.

For example, if the files to compare are encoded in UTF-8, you can set € as currency name by adding ‘-c '\xE2\x82\xAC'’ to the command line of numdiff, since the hexadecimal representation of € in UTF-8 is given by the sequence of bytes 0xE2 0x82 0xAC.

To see this in practice, if euro1 contains the text

	Profits			       Expenses

	+€430.10		      -€300.50
	+€750.20		      -€550.02
	+€876.24		      -€720.00

and euro2 the text

	Profits			       Expenses

	+€430.10		      -€300.00
	+€750.20		      -€550.02
	+€876.00		      -€720.00

then the report of ‘numdiff -c '\xE2\x82\xAC' euro1 euro2’ is

----------------
##3       #:2   <== -€300.50
##3       #:2   ==> -€300.00
 Absolute error = 5.0000000000e-1, Relative error = 1.6666666667e-3
----------------
##5       #:1   <== +€876.24
##5       #:1   ==> +€876.00
 Absolute error = 2.4000000000e-1, Relative error = 2.7397260274e-4

+++  File "euro1" differs from file "euro2"

Please consider that -c is only provided to let numdiff regard a field as numeric also in presence of a currency name immediately before its first digit: numdiff does not know anything about currencies and can not perform any kind of conversion between them. In addition, mind that the number after the currency name can be written in any format, not only in financial notation. numdiff can even cope with the currency name when it appears in a complex number. For example, with ‘-c EURnumdiff considers +EUR12-EUR0.24i and +12-0.24i as equal.

The options -d, -t, -g, -p, -n, -e and -i can be used to instruct numdiff about the numeric formats used in the files which it is going to compare. Since the two files to compare do not have to adopt the same numeric format, numdiff allows to specify different numeric formats for them. Each of the options -d, -t, -g, -p, -n, -e, and -i can have as argument one or two (single-byte) characters, in particular one or two digits if the option is -g. In the first case the argument refers to both files to compare, in the second case the first character is for the file specified first on the command line, the second character for the file specified last. For instance, the option -d can be used to tell numdiff which character(s) is(are) used to indicate the decimal point in the two files to compare. If you give the command ‘numdiff -d_ file1 file2’, then numdiff will understand that both in file1 and in file2 the character underscore (‘_’) is used in place of the default one (‘.’) to indicate the position of the decimal point in the numerical values. But if the command is ‘numdiff -d_: file1 file2’, then numdiff will understand that the decimal point is indicated by the character underscore in file1, and by colon (‘:’) in file2.

If you omit to use one of the options -d, -t, -g, -p, -n, -e, and -i, then the corresponding attribute will take its default value, see Default Numeric Format.

You should be careful whenever you use one or more of these options. First, not all characters can be passed to them as arguments. The arguments of the option -g must be digits, the arguments of the options -d and -t must be punctuation marks (punctuation marks are all the characters of the ASCII set for which the standard C function ispunct returns a non zero value), those ones of the options -p, -n, -e and -i must be graphical characters but digits (graphical characters are all the characters of the ASCII set for which the standard C function isgraph returns a non zero value).

It is not possible to set the decimal point, the thousands separator, the positive sign, the negative sign, the prefix for decimal exponent or the symbol of the imaginary unit in such a way that, for a same file, two or more of these characters come out to be equal. This rule also applies if you miss/omit to explicitly select a symbol through the appropriate option. For instance, the command ‘numdiff -d,. file1 file2’ will make numdiff abnormally terminate after printing the error message:

The numeric format specified for the first file is illegal,
the following symbols should be all different
while two or more of them are actually equal:

Decimal point = `,'
Thousands separator = `,'
Leading positive sign = `+'
Leading negative sign = `-'
Prefix for decimal exponent = `e'
Symbol used to denote the imaginary unit = `i'

With the option -d we have told numdiff that in the first file the decimal point is indicated by the character comma, but at the same time we have not modified the character in use to separate the groups of thousands, which has remained the default one, i.e. comma, for both files to compare. In this way we have implicitly told that in file1 the character comma represents both decimal point and thousands separator. Since this is not reasonable, numdiff refuses to work. To avoid this problem it would be sufficient to set explicitly the thousands separator by means of the option -t: ‘numdiff -d,. -t., file1 file2’. Of course, we assume here that the decimal point and the thousands separator are represented in file1 by comma and dot respectively, in file2 by dot and comma.

I strongly suggest you, whenever you write a file, to avoid using the same symbol for two different things (like would be using comma for both decimal point and thousands separator), it is nonsense.

At last, it is possible (but silly) to specify as argument for the options -d, -t, -g, -p, -n, -e, or -i one of the characters used as delimiters in the files to compare. numdiff does not complain, but you have to consider that the program first uses the set of field delimiters to split the files into fields and only afterwards, when it has to distinguish between numerical and non-numerical fields, it takes into account the numeric formats specified for the two files. To prevent conflicts, you should then avoid to specify as argument for the options -d, -t, -g, -p, -n, -e, or -i a character which is also used as field delimiter. As a general rule, in writing a file you should avoid using the same symbol to mean two different things. What we have said also explains why the argument of the option -c should never contain field delimiters.

The option -X can be used to restrict the comparison between files to a certain group of fields. This option requires as argument a range of positive integer values or eventually just one positive integer number. The argument indicates the position(s) of the fields that numdiff has to ignore. Remember that the fields of a line are numerated starting from the left hand of the line and proceeding towards the right hand.

The argument passed to -X can start with a prefix, which must be either ‘1:’ or ‘2:’. ‘1:’ refers to the file passed as first on the command line, ‘2:’ to the file specified as second. With the prefix ‘1:’ only the fields of the first file corresponding to the specified position(s) are ignored. Similarly, you have to use the prefix ‘2:’ if you want to ignore only fields from the second file.

The option -X can appear more times on the command line, in which case numdiff will ignore all fields located in the positions so specified. Some examples can clarify the use of ranges and prefixes. If the file List1 contains the data

* a  1    1     1     1
* b  2    2     2     2
* c  3    3     3     3
* d  4    4     4     4
* e  5    5     5     5

and List2 the data

     1    1.1  1.01   A  1.001  1.0001
     2    2.2  2.02   B  2.002  2.0002
     3    3.3  3.03   C  3.003  3.0003
     4    4.4  4.04   D  4.004  4.0004
     5    5.5  5.05   E  5.005  5.0005

then the output of ‘numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2’ is

----------------
##1       #:4   <== 1
##1       #:2   ==> 1.1
@ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1
##1       #:5   <== 1
##1       #:3   ==> 1.01
@ Absolute error = 1.0000000000e-2, Relative error = 1.0000000000e-2
----------------
##2       #:4   <== 2
##2       #:2   ==> 2.2
@ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1
##2       #:5   <== 2
##2       #:3   ==> 2.02
@ Absolute error = 2.0000000000e-2, Relative error = 1.0000000000e-2
----------------
##3       #:4   <== 3
##3       #:2   ==> 3.3
@ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1
##3       #:5   <== 3
##3       #:3   ==> 3.03
@ Absolute error = 3.0000000000e-2, Relative error = 1.0000000000e-2
----------------
##4       #:4   <== 4
##4       #:2   ==> 4.4
@ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1
##4       #:5   <== 4
##4       #:3   ==> 4.04
@ Absolute error = 4.0000000000e-2, Relative error = 1.0000000000e-2
----------------
##5       #:4   <== 5
##5       #:2   ==> 5.5
@ Absolute error = 5.0000000000e-1, Relative error = 1.0000000000e-1
##5       #:5   <== 5
##5       #:3   ==> 5.05
@ Absolute error = 5.0000000000e-2, Relative error = 1.0000000000e-2

+++  File "List1" differs from file "List2"

Numdiff cuts off from List1 the fields in the positions 1, 2 and 6 and from List2 the fields in the positions 4, 5 and 6. In this way it compares the third, fourth and fifth field of every line of List1 with the first, second and third field respectively of the corresponding line of List2. An equivalent form of the command ‘numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2’ is given by ‘numdiff -X 1:1-2 -X 2:4-5 -X 6 List1 List2’ : since the sixth field is cut off from both files, we can refer to it without a prefix.

As you can see, you can specify a range of fields by using the notation ‘m-n’, where m and n are the field numbers of the first and of the last field in the range. It is even possible to use range expressions like ‘m-’ or ‘-n’. The first expression corresponds to all fields starting from the mth one (inclusive) till to the end of line, the second selects all fields from the first one till to the nth one (inclusive). Therefore the command ‘numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2’ is equivalent to ‘numdiff -X 1:-2 -X 2:4 -X 1:6 -X 2:5- List1 List2’ and to ‘numdiff -X 1:-2 -X 1:6 -X 2:4- List1 List2’.

Mind that, while writing a specification for the option -X, the largest field number you can use is 32768.

If you employ the option -X the exit status of numdiff reflects the outcome of the restricted comparison. For instance, the exit status of ‘numdiff -X 8- file1 file2’ is 1 only if numdiff has found a difference in the first seven fields of file1 and file2. If the two files differ only in the fields after the seventh one, then numdiff ends with a zero exit status.

Going back to the example with List1 and List2, the output of ‘numdiff -X 1:1-2 -X 1:4- -X 2:2- List1 List2’ is

+++  Files "List1" and "List2" are equal

since every field of List1 at position 3 is equal to the first field in the corresponding line of List2. The exit code returned by the program to the shell is in this case zero.

The options -z, -Z, -m, -H, -f, and -T influence the action of the filter and their use is then described later, Filtering. Care that -z and -Z need both an argument in the same form required by -X.

Since version 5 Numdiff accepts also long options to conform to the GNU standards. For example, now it is possible to use ‘--separators='\n\t %'’ or ‘--separators '\n\t %'’ instead of using ‘-s '\n\t %'’.

The long options, which start all with two dashes, are listed at the beginning of this chapter, each one near to the corresponding short option.

The argument of a long option may or may not be preceded by the = sign. The only exceptions are the options --test-filter and --overview, for which the presence of the = before the argument is mandatory. Thus, ‘--test-filter=60’ is correct while ‘--test-filter 60’ is not accepted.


Next: , Previous: , Up: Top   [Contents][Index]

6 Selecting lines and fields for the comparison

Together with the version 5.x of Numdiff is shipped the program ndselect. Originally, I decided to create this utility in order to deal with a situation that comes out often in Numerical Analysis. Here I present a very simple example of such a situation. Let us suppose that file list1 contains the values of the square root, rounded to the 20th decimal digit, for all integer numbers between 12 and 24:

12       3.46410161513775458705
13       3.60555127546398929312
14       3.74165738677394138558
15       3.87298334620741688518
16       4
17       4.12310562561766054982
18       4.24264068711928514641
19       4.35889894354067355224
20       4.47213595499957939282
21       4.58257569495584000659
22       4.69041575982342955457
23       4.7958315233127195416
24       4.89897948556635619639

File list2 contains suitable approximations of the square root only for the numbers between 12 and 21 which are multiple of 3:

12       3.46410162002945508100
15       3.87298387096774193548
18       4.24264705882352941176
21       4.58260869565217391304

These approximations could have been obtained by using the famous Heron’s algorithm: given an approximation a for the square root of a number x, a better approximation is computed by using the formula a := 0.5 * (x/a + a). What we want now is to understand by means of numdiff how good the approximations contained in file list2 are. Unfortunately, we cannot execute directly the command ‘numdiff list1 list2’, since in this way we would compare the approximations provided for the square roots of 15, 18, and 21 with the square roots of 13, 14, and 15, respectively. To make the comparison in the right way, one could open list1 in a text editor and remove from this file all lines but the ones related to the numbers 12, 15, 18, and 21. This approach is practicable since we have to remove only a few lines: one can easily figure out how boring and inefficient would be to manually remove hundreds or thousands of lines from a file.

An expert GNU user would suggest that it is possible to automate this removal by using the well known utilities head and sed, in this particular case ‘head -n 10 list1 | sed -n -e '1~3 p' > List1’. A quick explanation for the ones who do not know how to use head and sed: the previous command extracts from list1 the first 10 lines, namely the lines containing the square roots of the numbers from 12 to 21, then picks every third line starting from the first one to select only the lines related to 12, 15, 18, and 21. Finally, these lines are printed to the file List1, which then looks like:

12       3.46410161513775458705
15       3.87298334620741688518
18       4.24264068711928514641
21       4.58257569495584000659

Once obtained List1, we can perform the comparison between the values we are interested in by means of ‘numdiff List1 list2’ . Unfortunately, this trick only works if you have installed the GNU version of sed which, as far as I know, is the only one providing the extension first~step to specify line addresses. This is why I decided to implement ndselect, which allows to obtain the same result as above with the simpler command ‘ndselect -b 1 -e 10 -s 3 list1 > List1’.

The meaning of the arguments passed to the options -b, -e, and -s is the following: we tell ndselect to print every third line of file list1 (the option -s specifies the step) starting from the first one (the option -b specifies the beginning) and ending within the tenth one possibly inclusive (the option -e specifies the end). Because of the presence of the redirection operator >, the previous command sends to the file List1 what ndselect would print to the screen (standard output).

Since version 5.6 ndselect can also be used to select particular fields of a file. Instead of printing all fields of every line, you may want to print indeed only the fields at particular positions. To do this you can employ the option -F to indicate the position of the first field to print, the option -L to indicate the position of the last field that can be printed, the option -I to set the increment when selecting the fields. In addition, the option -S can be used to specify a set of field delimiters different from the default one (which consists of blank, tab and newline). As for numdiff, the field delimiters are used to split the input lines into fields.

The option -S of ndselect recognizes and accepts the same escape sequences of numdiff options -s, -D, and -c.

As example consider the selection of the even fields between the second and the sixth one inclusive from the file many_many_columns, whose contents are shown here:

A |   I | 1.1 |   1.08  |   1.01  |  0.1  |   11.011    |    -1.0e-1  
B |  II | 2.2 |   2.16  |   4.04  |  0.4  |   24.024    |    -1.0e-2  
C | III | 3.3 |   3.24  |   9.09  |  0.9  |   39.039    |    -1.0e-3  
D |  IV | 4.4 |   4.32  |  16.16  |  1.6  |  416.039    |    -1.0e-4  
E |   V | 5.5 |   5.40  |  25.25  |  2.5  |  525.416    |    -1.0e-5  
F |   # |  #  |    #    |    #    |   #   |     #       |      #

This selection can be accomplished by means of the command ‘ndselect -S '| \t\n' -F 2 -L 6 -I 2 many_many_columns’, whose output shows only the selected fields:

I | 1.08  |   0.1
II | 2.16  |   0.4
III | 3.24  |   0.9
IV | 4.32  |  1.6
V | 5.40  |  2.5
# |  #    |    #

Of course, you can also select particular fields of particular lines, as shown by the output of the command ‘ndselect -S '| \t\n' -b 1 -e 5 -s 3 -F 2 -L 6 -I 2 many_many_columns’:

I | 1.08  |   0.1
IV | 4.32  |  1.6

By default, ndselect reuses the delimiters found in the input lines while writing the selected fields to the standard output. You can specify a custom separator by means of the option -O. This one recognizes and accepts the same escape sequences of numdiff options -s, -D, and -c. For example, ‘ndselect -S '| \t\n' -b 1 -e 5 -s 3 -F 2 -L 6 -I 2 -O '\t\t' many_many_columns’ puts two horizontal tabulations after every printed field:

I		1.08		0.1		
IV		4.32		1.6		

Even if the implementation of a filter in numdiff and the addition of the option -X have made ndselect much less useful than in the past, this tool can still be used to handle some special cases. In addition, it can be used as a filter for other programs than numdiff. The complete synopsis of ndselect can be found in the next chapter.


Next: , Previous: , Up: Top   [Contents][Index]

7 Invoking ndselect

SYNOPSIS

   ndselect -h|--help|-v|--version 

or

   ndselect [-b N][-e N][-s N][-F N][-L N][-I N][-S IFS][-D DELIMS]
   [-O OSEP][-x][-l PATH][-o PATH][FILE]

where FILE is the name of the file to read from.

In the first case ndselect prints a short help or/and version number, Copyright, License notice, and NO-Warranty disclaimer. In the second case ndselect prints to the standard output a subset of lines and fields from FILE. The complete path of FILE should be given, a directory name is not accepted. If no input file is specified, the program reads from the standard input.

OPTIONS

-b, --beginning, --start=N

Set to N the number of the first line to print (The default behavior is to start with line number 1)

-e, --end=N

Set to N the number of the last line that can be printed (The default behavior is to arrive till to the end of the file)

-s, --step=N

Set to N the increment to use when selecting the lines to print (The default value for the increment is 1)

-F, --first-field=N

Set to N the number of the first field to print (The default behavior is to start with field number 1)

-L, --last-field=N

Set to N the number of the last field that can be printed (The default behavior is to arrive till to the end of every line)

-I, --increment=N

Set to N the increment to use when selecting the fields to print (The default value for the increment is 1)

-S, --separators=IFS

Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline)

-D, --delimiters=DELIMS

Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline)

-O, --output-separator=OSEP

Specify the string to use as separator while writing the selected fields to the standard output (The default behavior consists in reusing the delimiters found in the input lines)

-x, --omit-empty-lines

Do not print empty lines

-l, --warnings-to=PATH

Redirect warning and error messages from stderr to the indicated file

-o, --output=PATH

Redirect output from stdout to the indicated file

-h, --help

Show this help message

-v, --version

Show version number, Copyright, Distribution Terms and NO-Warranty

Passing 0 as argument to the option -L or to -e is equivalent to omit this option and leave enabled the default behavior (which consists in scanning till to the end of the line and of the file, respectively).

DIAGNOSTICS

The exit status is 0 in case of normal termination, -1 (255) in case of error.

As numdiff does, since version 5 also ndselect accepts long options. Thus, instead of ‘ndselect -b 1 -e 10 -s 3 list1 > List1’ you can write ‘ndselect --start=1 --end=10 --step=3 list1 > List1’.

The usage of the option -D is the same as for numdiff. The option -S corresponds to the option -s of numdiff.


Next: , Previous: , Up: Top   [Contents][Index]

8 Using the filter of numdiff

Since version 5 you can activate a filter when launching numdiff to make the program appropriately compare the given files even if they do not have the same structure. Recalling the example of chapter 6, if you run the command numdiff -z 2- -V list1 list2 you obtain the following result:

----------------
##1       <== 12       3.46410161513775458705
##1       ==> 12       3.46410162002945508100

##1       #:2   <== 3.46410161513775458705
##1       #:2   ==> 3.46410162002945508100
 Absolute error = 4.8917004940e-9, Relative error = 1.4121122985e-9
----------------
##2       <== 13       3.60555127546398929312
          ==>

----------------
##3       <== 14       3.74165738677394138558
          ==>

----------------
##4       <== 15       3.87298334620741688518
##2       ==> 15       3.87298387096774193548

##4       #:2   <== 3.87298334620741688518
##2       #:2   ==> 3.87298387096774193548
 Absolute error = 5.2476032505e-7, Relative error = 1.3549253331e-7
----------------
##5       <== 16       4
          ==>

----------------
##6       <== 17       4.12310562561766054982
          ==>

----------------
##7       <== 18       4.24264068711928514641
##3       ==> 18       4.24264705882352941176

##7       #:2   <== 4.24264068711928514641
##3       #:2   ==> 4.24264705882352941176
 Absolute error = 6.3717042443e-6, Relative error = 1.5018250929e-6
----------------
##8       <== 19       4.35889894354067355224
          ==>

----------------
##9       <== 20       4.47213595499957939282
          ==>

----------------
##10      <== 21       4.58257569495584000659
##4       ==> 21       4.58260869565217391304

##10      #:2   <== 4.58257569495584000659
##4       #:2   ==> 4.58260869565217391304
 Absolute error = 3.3000696334e-5, Relative error = 7.2013423303e-6
----------------
##11      <== 22       4.69041575982342955457
          ==>

----------------
##12      <== 23       4.7958315233127195416
          ==>

----------------
##13      <== 24       4.89897948556635619639
          ==>


+++  File "list1" differs from file "list2"

Numdiff has recognized that the lines of list1 with the square roots for the numbers 13, 14, 16, 17, 19, 20, 22, 23, and 24 have been deleted from list2. The numerical comparison has been done by coupling each line of list2 with the line of list1 which displays the square root for the same integer value. The output obtained running the filter of Numdiff via numdiff -f -z 2- list1 list2 confirms this:

12       3.46410161513775458705         12       3.46410162002945508100
13       3.60555127546398929312      <
14       3.74165738677394138558      <
15       3.87298334620741688518         15       3.87298387096774193548
16       4                           <
17       4.12310562561766054982      <
18       4.24264068711928514641         18       4.24264705882352941176
19       4.35889894354067355224      <
20       4.47213595499957939282      <
21       4.58257569495584000659         21       4.58260869565217391304
22       4.69041575982342955457      <
23       4.7958315233127195416       <
24       4.89897948556635619639      <


+++  File "list1" differs from file "list2"

If you compare the command numdiff -z 2- -V list1 list2 with the one used for the files bill1 and bill2, see command, you surely notice that the filter has been invoked in different ways, first with -z @ and then with -z 2-.

The synchronization procedure used by the filter is based on blurring and byte-by-byte comparison. The options -z and -Z are used to select which fields from which file have to be blurred. They take both an argument in the same form requested by -X, see Use of the option -X, but accept additionally the special value ‘@’ as abbreviation for the range of fields ‘1-’. Thus, the specifications ‘1:@’, ‘2:@’ and ‘@’ are used to mean all fields of the first file, of the second one or of both, respectively.

Employing -z and -Z in the right way is extremely important to let the filter work as desired. For instance, numdiff -f -z @ list1 list2 matches the lines of list1 and list2 in the same wrong way

12       3.46410161513775458705         12       3.46410162002945508100
13       3.60555127546398929312         15       3.87298387096774193548
14       3.74165738677394138558         18       4.24264705882352941176
15       3.87298334620741688518         21       4.58260869565217391304
16       4                           <
17       4.12310562561766054982      <
18       4.24264068711928514641      <
19       4.35889894354067355224      <
20       4.47213595499957939282      <
21       4.58257569495584000659      <
22       4.69041575982342955457      <
23       4.7958315233127195416       <
24       4.89897948556635619639      <


+++  File "list1" differs from file "list2"

as Numdiff would do without employing the filter.

It is essential then to understand what blurring a field means and how the filter uses blurring to match the lines of the files to compare.

After reading the files the filter removes from each of them (from their images in the memory, actually) all the fields selected by the option -X, then it replaces each of the fields that have to be blurred by a special character. This special character is the same for both files and it is so chosen that it cannot appear in the text. Blurring a field means to replace it by this sort of place card.

After doing this, the filter converts all remaining numerical fields to a standard format and then compares the files byte by byte neglecting the field delimiters. This comparison is just used to establish which lines of the first file are not present in the second, which lines of the second file are missing in the first one, and how to match the remaining lines to create a one-to-one correspondence.

Only at this point numdiff inspects each couple of corresponding lines, splits the two lines into the constituent fields, and neglecting those ones eventually specified through the option -X compares corresponding fields as it is supposed to do, performing a numerical comparison whenever the fields are both legal numerical values.

Blurring the right fields is essential to appropriately match the lines from the two files before doing any numerical comparison. Without blurring, the numerical fields could prevent the filter of numdiff from an appropriate matching of the lines by creating confusion with their (maybe small) numeric differences.

Blurring can be of two types, conditional or unconditional. The blurring is conditional if it has to be performed only for fields which turn out to be legal numerical values. The arguments of the option -z indicate which fields of which file have to be blurred under the condition that they are recognized as numeric fields. Non-numeric fields are left by -z untouched (no blurring occurs for them). Then ‘-z 1:5-7’ makes the filter blur the 5th, 6th and 7th field of each line of the first file whenever they are recognized as numeric.

By means of the option -Z you can specify which fields have to be unconditionally blurred, i.e. independently of their type, numeric or not. For example, ‘-Z 2:3-4’ activates the blurring of the 3th and 4th field of each line of the second file.

Going back to the comparison of the files list1 and list2, the option ‘-z 2-’ of the command ‘numdiff -z 2- -V list1 list2’ makes the filter transform the (memory copies of the) two files as

12       •
13       •
14       •
15       •
16       •
17       •
18       •
19       •
20       •
21       •
22       •
23       •
24       •

and

12       •
15       •
18       •
21       •

respectively. Here • denotes the special symbol used by the filter in the blurring procedure, even if this symbol is not actually a bullet. Since in this example space, tab and newline are used as field delimiters, the byte-by-byte comparison between the transformed files produces the same result displayed by the command ‘sdiff -W’ when applied to them:

12       •                        12       •
13       •                     <
14       •                     <
15       •                        15       •
16       •                     <
17       •                     <
18       •                        18       •
19       •                     <
20       •                     <
21       •                        21       •
22       •                     <
23       •                     <
24       •                     <

If you put the blurred fields back you obtain exactly the output of ‘numdiff -f -z 2- list1 list2’, i.e. the outcome of the filtering:

12       3.46410161513775458705           12       3.46410162002945508100
13       3.60555127546398929312        <
14       3.74165738677394138558        <
15       3.87298334620741688518           15       3.87298387096774193548
16       4                             <
17       4.12310562561766054982        <
18       4.24264068711928514641           18       4.24264705882352941176
19       4.35889894354067355224        <
20       4.47213595499957939282        <
21       4.58257569495584000659           21       4.58260869565217391304
22       4.69041575982342955457        <
23       4.7958315233127195416         <
24       4.89897948556635619639        <


+++  File "list1" differs from file "list2"

Since the second field is a numerical value in all lines of list1 and list2, using the option -Z instead of -z makes no difference in this case. The output of ‘numdiff -f -Z 2- list1 list2’ is then the same of ‘numdiff -f -z 2- list1 list2’.

After this explanation you should also understand why ‘numdiff -f -z @ list1 list2’ gives a wrong result. Since also the first field is always a numerical value, the option ‘-z @’ makes the filter transform the two given files as

•       •
•       •
•       •
•       •
•       •
•       •
•       •
•       •
•       •
•       •
•       •
•       •
•       •

and

•       •
•       •
•       •
•       •

respectively, making then impossible to match the lines in a reasonable way.

We consider now a typical situation in which it is better to use -Z in place of -z. If file Table1 contains

-6 	 2.449490
-5 	 2.236068
-4 	 2.000000
-3 	 1.732051
-2 	 1.414214
-1       1.000000
0        0
- - - - - - - - -
1 	 1.000000
2 	 1.414214
3 	 1.732051
4 	 2.000000
- - - - - - - - -
5 	 2.236068
6 	 2.449490
7 	 2.645751
- - - - - - - - -
8 	 2.828427
9 	 3.000000
10 	 3.162278
11 	 3.316625
12 	 3.464102
- - - - - - - - -
- - - - - - - - -
13 	 3.605551
14 	 3.741657

and Table2 contains

-6       Not_defined
-4       Not_defined
-2       Not_defined
 0       0.000000
 2 	 1.414216
 4 	 2.000000
 6 	 2.449494
 8 	 2.828469
 10 	 3.162278
 12 	 3.464102
 14 	 3.741658
********************END

then the output of ‘numdiff -z 1:2 -Z 2:2 -f Table1 Table2’ is

-6       2.449490               -6       Not_defined
-5       2.236068            <
-4       2.000000               -4       Not_defined
-3       1.732051            <
-2       1.414214               -2       Not_defined
-1       1.000000            <
0        0                       0       0.000000
- - - - - - - - -            <
1        1.000000            <
2        1.414214                2       1.414216
3        1.732051            <
4        2.000000                4       2.000000
- - - - - - - - -            <
5        2.236068            <
6        2.449490                6       2.449494
7        2.645751            <
- - - - - - - - -            <
8        2.828427                8       2.828469
9        3.000000            <
10       3.162278                10      3.162278
11       3.316625            <
12       3.464102                12      3.464102
- - - - - - - - -            <
- - - - - - - - -            <
13       3.605551            <
14       3.741657                14      3.741658
                             >  ********************END


+++  File "Table1" differs from file "Table2"

which is exactly what is expected. On the other hand the command ‘numdiff -z 2 -f Table1 Table2’ displays

-6       2.449490            |  -6       Not_defined
-5       2.236068            |  -4       Not_defined
-4       2.000000            |  -2       Not_defined
-3       1.732051            <
-2       1.414214            <
-1       1.000000            <
0        0                       0       0.000000
- - - - - - - - -            <
1        1.000000            <
2        1.414214                2       1.414216
3        1.732051            <
4        2.000000                4       2.000000
- - - - - - - - -            <
5        2.236068            <
6        2.449490                6       2.449494
7        2.645751            <
- - - - - - - - -            <
8        2.828427                8       2.828469
9        3.000000            <
10       3.162278                10      3.162278
11       3.316625            <
12       3.464102                12      3.464102
- - - - - - - - -            <
- - - - - - - - -            <
13       3.605551            <
14       3.741657                14      3.741658
                             >  ********************END


+++  File "Table1" differs from file "Table2"

which is partially wrong.

Notice that in Table1 you find (truncated to the sixth decimal digit) the square roots of the absolute values of the integer numbers between -6 and 20, plus some randomly added lines. The file Table2 contains approximations (obtained by Newton’s method) of the square roots of the even numbers between -6 and 20. Since the (real) square root is not defined for negative numbers, the values corresponding to -6, -4 and -2 are replaced by Not_defined.

Since Not_defined is not a numeric value, during the execution of the last command the filter transforms Table1 in this way

-6       •
-5       •
-4       •
-3       •
-2       •
-1       •
0        •
- - - - - - - - -
1        •
2        •
3        •
4        •
- - - - - - - - -
5        •
6        •
7        •
- - - - - - - - -
8        •
9        •
10       •
11       •
12       •
- - - - - - - - -
- - - - - - - - -
13       •
14       •

and Table2 in this other way

-6       Not_defined
-4       Not_defined
-2       Not_defined
 0       •
 2       •
 4       •
 6       •
 8       •
 10      •
 12      •
 14      •
********************END

Unfortunately the first three lines are enough to confuse the synchronization procedure of the filter, which is based on a byte-by-byte comparison with exclusion of the field delimiters, as explained before.

You can check that this is definitely the case by looking at the output of the command ‘sdiff -W’ on the transformed files, which is

-6       •           |  -6       Not_defined
-5       •           |  -4       Not_defined
-4       •           |  -2       Not_defined
-3       •           <
-2       •           <
-1       •           <
0        •               0       •
- - - - - - - - -    <
1        •           <
2        •               2       •
3        •           <
4        •               4       •
- - - - - - - - -    <
5        •           <
6        •               6       •
7        •           <
- - - - - - - - -    <
8        •               8       •
9        •           <
10       •               10      •
11       •           <
12       •               12      •
- - - - - - - - -    <
- - - - - - - - -    <
13       •           <
14       •               14      •
                     >  ********************END

If we give the command ‘numdiff -z 1:2 -Z 2:2 -f Table1 Table2’ instead of ‘numdiff -z 2 -f Table1 Table2’, the second field of the lines of Table2 is always blurred. The filter transforms then Table2 into

-6       •
-4       •
-2       •
 0       •
 2       •
 4       •
 6       •
 8       •
 10      •
 12      •
 14      •
********************END

and re-synchronizes the files Table1 and Table2 in the right way.

Using the unconditional blurring is suggested in all cases when a certain field, which you want to include in the comparison (use -X to completely neglect one or more fields), is of numeric type in almost all lines of (one of) the given files. This can be for instance the case when in some lines the contents of the field are given by a special numeric value, like Infinity, Inf, +Inf or -Inf, or by NaN, abbreviation for Not a Number.

Concerning the numeric fields which are not blurred, it is worth remarking that the filter is not confused by differences in the numeric format. Before the byte-by-byte comparison, numeric values are converted indeed to a standard format. To offer an example of this, let us suppose that short1 contains a list of numbers with their logarithms

0.001          -3
0.01           -2
0.1            -1
1               0
1000            3
1000000         6
1000000000      9

and short2 the same list of numbers and logarithms, but with differences in the numeric format:

******************
0.0010000       -3
.0100           -2
0000.10         -1
1.               0
1,000.000        3
1,000,000.       6
1,000,000,000    9

Then ‘numdiff -f -z 2- short1 short2’ displays

                             >  ******************
0.001          -3               0.0010000       -3
0.01           -2               .0100           -2
0.1            -1               0000.10         -1
1               0               1.               0
1000            3               1,000.000        3
1000000         6               1,000,000.       6
1000000000      9               1,000,000,000    9


+++  File "short1" differs from file "short2"

showing that the filter has matched the lines in the right way.

The filter can even handle the case when the same numerical value is written in decimal notation in one file and in scientific notation in the other one. If the files decimal and scientific contain

.001           -3
.01            -2
.1             -1
* * * * * * * * *
1               0
1000            3
1000000         6
1000000000      9

and

*****************
1.0e-3         -3
1.0e-2         -2
1.0e-1         -1
1.0e0           0
1.0e3           3
1.0e6           6
1.0e9           9
*****************

respectively, then ‘numdiff -f -z 2- decimal scientific’ prints

                             >  *****************
.001           -3               1.0e-3         -3
.01            -2               1.0e-2         -2
.1             -1               1.0e-1         -1
* * * * * * * * *            < 
1               0               1.0e0           0
1000            3               1.0e3           3
1000000         6               1.0e6           6
1000000000      9               1.0e9           9
                             >  *****************


+++  File "decimal" differs from file "scientific"

proving that the filter does not get confused.

No problems arise also in the case when for the same field the scientific notation is used in both files. If the files sc1 and sc2 contain

  1.E-3          -3
  1.00E-2        -2
  1.0E-1         -1
  1.0000E0        0
001.0E3           3
+01.000E6         6
  1.0E+09         9
  1.0E+10        10
* * * * * * * * * *

and

*****************
 1.0e-003      -3
 1.0e-2        -2
 1.0e-1        -1
 1.0e0          0
+1.0e3          3
 1.0e+6         6
 1.0e9          9

respectively, then ‘numdiff -f -z 2- sc1 sc2’ correctly displays

                             >  *****************
  1.E-3          -3              1.0e-003      -3
  1.00E-2        -2              1.0e-2        -2
  1.0E-1         -1              1.0e-1        -1
  1.0000E0        0              1.0e0          0
001.0E3           3             +1.0e3          3
+01.000E6         6              1.0e+6         6
  1.0E+09         9              1.0e9          9
  1.0E+10        10          <
* * * * * * * * * *          <


+++  File "sc1" differs from file "sc2"

The filter can even handle an improper use of the scientific notation, meaning for example that it can recognize ‘123.456E+2’ and ‘1.23456E+4’ as equal.

We can see this in the case of the files Scnot1:

-------------------------
1.2E0             *     1
2.45E-1           *     2
-3.678E-2         *     3

and Scnot2:

12E-1             *     1
245E-3            *     2
-0.003678E+1      *     3

numdiff -f -z 3- Scnot1 Scnot2’ displays the report:

-------------------------    <
1.2E0             *     1       12E-1             *     1
2.45E-1           *     2       245E-3            *     2
-3.678E-2         *     3       -0.003678E+1      *     3


+++  File "Scnot1" differs from file "Scnot2"

which is exactly what you would expect in such a case. Also pretty hard cases do not confuse the filter. If Scnot1 is given by

 1.2000e0         *     1
02.4500e-1        *     2
-003.678E-2       *     3

and Scnot2 is the same file as before, the output of the command ‘numdiff -f -z 3- Scnot1 Scnot2’ is still right:

 1.2000e0         *     1       12E-1             *     1
02.4500e-1        *     2       245E-3            *     2
-003.678E-2       *     3       -0.003678E+1      *     3


+++  Files "Scnot1" and "Scnot2" have the same structure

In all examples above the option -f is used with no argument.

However, -f accepts an optional argument, which can be used to control how -f displays its output. If you provide an argument, care not to leave any space between the option and the argument: ‘-f60’ is correct while ‘-f 60’ makes Numdiff terminate after printing an error message.

If the argument is a positive number NUM, then the side-by-side output produced by -f will be NUM columns wide. The default value for the width of the output is 130, which can fit onto a traditional printer line, and is the one used when -f has no argument, or the supplied argument is zero. In other words, ‘-f’ and ‘-f0’ are just easier to remind versions of ‘-f130’.

A negative argument has the same effect as the positive argument with the same absolute value, but it causes in addition the removal of common lines from the output. For example, the command ‘numdiff -z 1:2 -Z 2:2 -f-130 Table1 Table2’ displays the following text

-5       2.236068            <
-3       1.732051            <
-1       1.000000            <
- - - - - - - - -            <
1        1.000000            <
3        1.732051            <
- - - - - - - - -            <
5        2.236068            <
7        2.645751            <
- - - - - - - - -            <
9        3.000000            <
11       3.316625            <
- - - - - - - - -            <
- - - - - - - - -            <
13       3.605551            <
                             >  ********************END


+++  File "Table1" differs from file "Table2"

In conjunction with the option -f or -O you can use -T to expand tabs to spaces in the produced output. This is useful to preserve the alignment of tabs in the input files, if it is thrown off by the presence of the gutter.

The options -H and -m affect the performance of the filter of Numdiff. But performance has more than one dimension and these options improve one aspect of performance at the cost of another, or they improve performance in some cases while hurting it in others.

The re-synchronization of the two compared files made by the filter always comes up with a near-minimal set of deletions/insertions of lines, that usually is good enough for practical purposes. If the filter displays a large set of line deletions/insertions, you might want it to use a modified algorithm that sometimes produces a smaller set of differences. The -m option does this; however, it can also cause the filter to run more slowly than usual, so it is not the default behavior.

If the files you are comparing are large and have small groups of changes scattered throughout them, you can use the -H option to make a different modification to the algorithm employed by the filter. If the input files have a constant small density of changes, where change means here deletion/insertion of lines, this option speeds up the comparison without changing the output or in the worst case introducing minor modifications.


Next: , Previous: , Up: Top   [Contents][Index]

9 Warnings

  • Bug reports have to be sent to the address ivprimi(at)libero(dot)it . Please, put Numdiff in the subject and indicate the version of the operating system you are running (in particular, do not forget to specify if it is a 32- or a 64-bit system), and, if you know it, the version of the compiler used to build Numdiff. Please write also whether your version of Numdiff uses the GNU MP library or not. Before writing an email be sure to run the latest stable version of Numdiff, I do not provide support for older versions.
  • Numdiff does not accept numbers in scientific notation whose exponents lie outside the range -1073741824, …, +1073741824. If such a number is found in any of the files to compare, the execution of the program is stopped after printing a suitable error message on stderr. Under the assumption that the numeric format in use is the default one, with "1.0001e-2147483640" the displayed error messages is
    numdiff: A number with a too small exponent has been found,
    namely "1.0001e-2147483640".
    Exponents smaller than -1073741824 are not accepted,
    the execution of the program ends now
    
  • If Numdiff has been built with its own internal support for multiple precision arithmetic instead of being linked against the GNU MP Library, then performance degradation and memory exhaustion can already make impossible to handle exponents of magnitude 10^6 = 1000000. This is what I obtained on my laptop, equipped with a dual core processor @1.50 GHz and with 1GB of RAM, when I tried to compare the numbers 1.101e1000000000 and 1.0e1000000000:
    numdiff: Insufficient memory for new allocation,
    the execution of the program ends now
    

    In addition, you can overload the processor with numbers whose exponents lie outside the range -1000000, …, 1000000. But at least on my machine, everything works fine and quick enough as long as exponent and size of the mantissa of the numbers are in the range -1000, …, 1000. Be careful and remember that Numdiff is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    Consider also that, if you have numeric data with exponents outside the range -300, …, 300, probably there is something wrong with your data: either you are using the wrong scale, or you should replace very small numbers, like 1e-100, by zero, or it is quite likely that the machine/program/algorithm which produced these data is not working right.

  • If Numdiff has been linked against the GNU Multiple Precision Arithmetic Library (also called GNU MP), then the precision it uses is typically higher than the specified one. On my machine the actual value of the precision is 20 if the user gives a value between 0 and 20, 30 if the user specifies a precision between 21 and 30, 40 for a user-specified value between 31 and 40, and so on. Anyway, the actual precision is never less than the one required by the user.
  • After reading a numeric field, Numdiff truncates its value if this number has too much digits with respect to the current precision. To be precise, denoted by P the current value of the precision, the following rules apply.

    If numdiff has been built with its own internal support for multiple precision arithmetic, then

    • if the number is written in ordinary decimal notation, numdiff will consider, in addition to all digits of the integer part, only the first P digits of the fractional part;
    • if the value is written in scientific notation, then numdiff will only consider the first P digits of the fractional part of the mantissa.

    If numdiff uses the GNU MP library to perform its computations, the value of a numeric field is first translated into scientific notation and then only the first P digits of the fractional part of the mantissa are considered.

    By current value of the precision I mean the integer value specified by the option -#, or the default one (35) when this option is not in use.

  • You can find out whether your local version of numdiff is relying on GNU MP or not by executing the command ‘numdiff -v’. If numdiff uses GNU MP, then this command will display the following message or similar (possibly translated into your mother language) among other information:
    The software has been linked against
    the GNU Multiple Precision Arithmetic Library,
    version number 4.2.4.
    

    If numdiff does not rely on GNU MP, then the displayed message will be (up to translation into your mother language)

    The software has been built with
    its own internal support for multiple precision arithmetic.
    
  • Numdiff can only be used on text files: the program terminates after printing a suitable error message if one of the files to compare turns out to be a binary file. To detect if a file is binary or not, numdiff checks for the presence of null bytes (0x00) in the file.
  • If you are not including the so called white-space characters (usually ‘ ’, ‘\t’, ‘\f’, ‘\v’ and ‘\r’) in the set of field delimiters, then a real and an imaginary number which are separated just by white-spaces can be coupled together and considered as a whole complex number. For example, if you are using only colon (‘:’) and newline as field delimiters and Numdiff finds a line like that
    ::::3.0-5.6e-356i::::-12.9   +4.34i::::-12.9    4.34i::::New York::::
    

    then it will consider this line as formed by four fields, the first two are numeric and given by the complex numbers 3.0-5.6e-356i and -12.9+4.34i, the last two ones are the strings New York and -12.9 4.34i. I still do not know if I will modify this in the next version of Numdiff, so that the program recognizes only 3.0-5.6e-356i as numeric field and treats -12.9 +4.34i as non-numeric due to the presence of spaces in the middle. -12.9 4.34i is already considered as non-numeric due to the absence of a leading sign in the imaginary value.

  • We have seen that one of the two files passed to numdiff can be -, which refers to stdin (standard input). In this way one of the two files to compare can be the output produced by another command, like in ‘cat file2 | numdiff -a 1.0e-3 file1 -’. However, if you activate the filter by means of the options -z or/and -Z, Numdiff can not work with the standard input unless you use also the option -f. Therefore, the command ‘cat file2 | numdiff -a 1.0e-3 -z @ file1 -’ displays only the error message
    numdiff: -: Illegal seek
    

    (or maybe the translation of this message in the language you are using on your computer) but ‘cat file2 | numdiff -a 1.0e-3 -z @ -f file1 -’ works as expected.

  • This manual describes the version 5.9 of Numdiff. Prior 5.x versions did not recognize all the options that are currently accepted, versions 4.0.0 and 3.x used even a different format for the output.

Up: Top   [Contents][Index]

Appendix A GNU Free Documentation License

Version 1.3, 3 November 2008
Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
http://fsf.org/

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
  1. PREAMBLE

    The purpose of this License is to make a manual, textbook, or other functional and useful document free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.

    This License is a kind of “copyleft”, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.

    We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.

  2. APPLICABILITY AND DEFINITIONS

    This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The “Document”, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as “you”. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.

    A “Modified Version” of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.

    A “Secondary Section” is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document’s overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.

    The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.

    The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.

    A “Transparent” copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not “Transparent” is called “Opaque”.

    Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.

    The “Title Page” means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, “Title Page” means the text near the most prominent appearance of the work’s title, preceding the beginning of the body of the text.

    The “publisher” means any person or entity that distributes copies of the Document to the public.

    A section “Entitled XYZ” means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when you modify the Document means that it remains a section “Entitled XYZ” according to this definition.

    The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.

  3. VERBATIM COPYING

    You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.

    You may also lend copies, under the same conditions stated above, and you may publicly display copies.

  4. COPYING IN QUANTITY

    If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document’s license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.

    If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.

    If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.

    It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.

  5. MODIFICATIONS

    You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:

    1. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.
    2. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement.
    3. State on the Title page the name of the publisher of the Modified Version, as the publisher.
    4. Preserve all the copyright notices of the Document.
    5. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.
    6. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.
    7. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document’s license notice.
    8. Include an unaltered copy of this License.
    9. Preserve the section Entitled “History”, Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled “History” in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.
    10. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the “History” section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.
    11. For any section Entitled “Acknowledgements” or “Dedications”, Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein.
    12. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles.
    13. Delete any section Entitled “Endorsements”. Such a section may not be included in the Modified Version.
    14. Do not retitle any existing section to be Entitled “Endorsements” or to conflict in title with any Invariant Section.
    15. Preserve any Warranty Disclaimers.

    If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version’s license notice. These titles must be distinct from any other section titles.

    You may add a section Entitled “Endorsements”, provided it contains nothing but endorsements of your Modified Version by various parties—for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.

    You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.

    The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.

  6. COMBINING DOCUMENTS

    You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.

    The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.

    In the combination, you must combine any sections Entitled “History” in the various original documents, forming one section Entitled “History”; likewise combine any sections Entitled “Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections Entitled “Endorsements.”

  7. COLLECTIONS OF DOCUMENTS

    You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.

    You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.

  8. AGGREGATION WITH INDEPENDENT WORKS

    A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an “aggregate” if the copyright resulting from the compilation is not used to limit the legal rights of the compilation’s users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.

    If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document’s Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.

  9. TRANSLATION

    Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.

    If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.

  10. TERMINATION

    You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License.

    However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

    Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

    Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it.

  11. FUTURE REVISIONS OF THIS LICENSE

    The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.

    Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License “or any later version” applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy’s public statement of acceptance of a version permanently authorizes you to choose that version for the Document.

  12. RELICENSING

    “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A “Massive Multiauthor Collaboration” (or “MMC”) contained in the site means any set of copyrightable works thus published on the MMC site.

    “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization.

    “Incorporate” means to publish or republish a Document, in whole or in part, as part of another Document.

    An MMC is “eligible for relicensing” if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008.

    The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing.

ADDENDUM: How to use this License for your documents

To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:

  Copyright (C)  year  your name.
  Permission is granted to copy, distribute and/or modify this document
  under the terms of the GNU Free Documentation License, Version 1.3
  or any later version published by the Free Software Foundation;
  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
  Texts.  A copy of the license is included in the section entitled ``GNU
  Free Documentation License''.

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with…Texts.” line with this:

    with the Invariant Sections being list their titles, with
    the Front-Cover Texts being list, and with the Back-Cover Texts
    being list.

If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.

If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.


Previous: , Up: Top   [Contents][Index]

Index

Jump to:   A   B   C   D   F   G   H   I   L   N   O   P   R   S   T   U   W  
Index Entry  Section

A
Acknowledgments: Acknowledgments

B
Build: Installing

C
Caveats: Warnings
Command line options for ndselect: Invoking ndselect
Command line options for numdiff: Invoking numdiff
Compile: Installing
Copying Conditions: Copying

D
Diagnostics (ndselect): Invoking ndselect
Diagnostics (numdiff): Invoking numdiff

F
FDL: GNU Free Documentation License
Filter: Filtering
Filter output (numdiff): Filter output
Format of the reports: Output format

G
GNU FDL: GNU Free Documentation License
GNU Free Documentation License: GNU Free Documentation License
GNU General Public License: Copying
GPL: Copying

H
How to use numdiff: Overview

I
Install: Installing
Introduction: Overview
Invoking ndselect: Invoking ndselect
Invoking numdiff: Invoking numdiff

L
License: Copying

N
ndselect (introduction to its use): ndselect
Notes: Warnings

O
Options, command line (ndselect): Invoking ndselect
Options, command line (numdiff): Invoking numdiff
Output format (numdiff): Output format
Overview mode of numdiff: Overview mode

P
Predefined settings of numdiff: Invoking numdiff
Purposes: Overview

R
Raw output format: Raw output

S
Side-by-side report (numdiff): Overview mode
Synopsis (ndselect): Invoking ndselect
Synopsis (numdiff): Invoking numdiff

T
Thanks: Acknowledgments
Tools: ndselect

U
Usage of numdiff: Overview

W
Warnings: Warnings

Jump to:   A   B   C   D   F   G   H   I   L   N   O   P   R   S   T   U   W  

Footnotes

(1)

By major numerical differences and major errors I mean those ones listed in the output of numdiff if none of the options -U, -f, -O, and -q is used.


numdiff-5.9.0/docs/fdl.texi0000644000175000017500000005601513054341114015074 0ustar paologpaolog@c The GNU Free Documentation License. @center Version 1.3, 3 November 2008 @c This file is intended to be included within another document, @c hence no sectioning command or @node. @display Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. @uref{http://fsf.org/} Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @end display @enumerate 0 @item PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document @dfn{free} in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of ``copyleft'', which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. @item APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The ``Document'', below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as ``you''. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A ``Modified Version'' of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A ``Secondary Section'' is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The ``Invariant Sections'' are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The ``Cover Texts'' are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A ``Transparent'' copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not ``Transparent'' is called ``Opaque''. Examples of suitable formats for Transparent copies include plain @sc{ascii} without markup, Texinfo input format, La@TeX{} input format, @acronym{SGML} or @acronym{XML} using a publicly available @acronym{DTD}, and standard-conforming simple @acronym{HTML}, PostScript or @acronym{PDF} designed for human modification. Examples of transparent image formats include @acronym{PNG}, @acronym{XCF} and @acronym{JPG}. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, @acronym{SGML} or @acronym{XML} for which the @acronym{DTD} and/or processing tools are not generally available, and the machine-generated @acronym{HTML}, PostScript or @acronym{PDF} produced by some word processors for output purposes only. The ``Title Page'' means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, ``Title Page'' means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The ``publisher'' means any person or entity that distributes copies of the Document to the public. A section ``Entitled XYZ'' means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as ``Acknowledgements'', ``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' of such a section when you modify the Document means that it remains a section ``Entitled XYZ'' according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. @item VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. @item COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. @item MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: @enumerate A @item Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. @item List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. @item State on the Title page the name of the publisher of the Modified Version, as the publisher. @item Preserve all the copyright notices of the Document. @item Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. @item Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. @item Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. @item Include an unaltered copy of this License. @item Preserve the section Entitled ``History'', Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled ``History'' in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. @item Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the ``History'' section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. @item For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. @item Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. @item Delete any section Entitled ``Endorsements''. Such a section may not be included in the Modified Version. @item Do not retitle any existing section to be Entitled ``Endorsements'' or to conflict in title with any Invariant Section. @item Preserve any Warranty Disclaimers. @end enumerate If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled ``Endorsements'', provided it contains nothing but endorsements of your Modified Version by various parties---for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. @item COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled ``History'' in the various original documents, forming one section Entitled ``History''; likewise combine any sections Entitled ``Acknowledgements'', and any sections Entitled ``Dedications''. You must delete all sections Entitled ``Endorsements.'' @item COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. @item AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an ``aggregate'' if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. @item TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled ``Acknowledgements'', ``Dedications'', or ``History'', the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. @item TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. @item FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See @uref{http://www.gnu.org/copyleft/}. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License ``or any later version'' applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. @item RELICENSING ``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A ``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the site means any set of copyrightable works thus published on the MMC site. ``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. ``Incorporate'' means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is ``eligible for relicensing'' if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. @end enumerate @page @heading ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: @smallexample @group Copyright (C) @var{year} @var{your name}. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. @end group @end smallexample If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the ``with@dots{}Texts.'' line with this: @smallexample @group with the Invariant Sections being @var{list their titles}, with the Front-Cover Texts being @var{list}, and with the Back-Cover Texts being @var{list}. @end group @end smallexample If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. @c Local Variables: @c ispell-local-pdict: "ispell-dict" @c End: numdiff-5.9.0/docs/ndselect.10000644000175000017500000000661513054341114015320 0ustar paologpaolog.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.46.4. .TH NDSELECT "1" "January 2017" "ndselect 5.9.0" "User Commands" .SH NAME ndselect \- select lines and fields for numdiff .SH DESCRIPTION Usage: ndselect \fB\-h\fR|\-\-help|\-v|\-\-version or .PP ndselect [\-b N][\-e N][\-s N][\-F N][\-L N][\-I N][\-S IFS][\-D DELIMS][\-O OSEP][\-x][\-l PATH][\-o PATH] [FILE] .PP Print to standard output a subset of lines and fields from a given file. .PP The argument after the options is the name of the file to read from. The complete path of the file should be given, a directory name is not accepted. If no input file is specified, the program reads from the standard input. .PP Exit status: 0 in case of normal termination, \fB\-1\fR (255) in case of error .PP \fB\-b\fR, \fB\-\-beginning\fR, \fB\-\-start\fR=\fI\,N\/\fR .IP Set to N the number of the first line to print (The default behavior is to start with line number 1) .PP \fB\-e\fR, \fB\-\-end\fR=\fI\,N\/\fR .IP Set to N the number of the last line that can be printed (The default behavior is to arrive till to the end of the file) .PP \fB\-s\fR, \fB\-\-step\fR=\fI\,N\/\fR .IP Set to N the increment to use when selecting the lines to print (The default value for the increment is 1) .PP \fB\-F\fR, \fB\-\-first\-field\fR=\fI\,N\/\fR .IP Set to N the number of the first field to print (The default behavior is to start with field number 1) .PP \fB\-L\fR, \fB\-\-last\-field\fR=\fI\,N\/\fR .IP Set to N the number of the last field that can be printed (The default behavior is to arrive till to the end of every line) .PP \fB\-I\fR, \fB\-\-increment\fR=\fI\,N\/\fR .IP Set to N the increment to use when selecting the fields to print (The default value for the increment is 1) .PP \fB\-S\fR, \fB\-\-separators\fR=\fI\,IFS\/\fR .IP Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline) .PP \fB\-D\fR, \fB\-\-delimiters\fR=\fI\,DELIMS\/\fR .IP Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline) .PP \fB\-O\fR, \fB\-\-output\-separator\fR=\fI\,OSEP\/\fR .IP Specify the string to use as separator while writing the selected fields to the standard output (The default behavior consists in reusing .IP the delimiters found in the input lines) .PP \fB\-x\fR, \fB\-\-omit\-empty\-lines\fR .IP Do not print empty lines .PP \fB\-l\fR, \fB\-\-warnings\-to\fR=\fI\,PATH\/\fR .IP Redirect warning and error messages from stderr to the indicated file .PP \fB\-o\fR, \fB\-\-output\fR=\fI\,PATH\/\fR .IP Redirect output from stdout to the indicated file .PP \fB\-h\fR, \fB\-\-help\fR .IP Show this help message .PP \fB\-v\fR, \fB\-\-version\fR .IP Show version number, Copyright, Distribution Terms and NO\-Warranty .SH COPYRIGHT Copyright \(co 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi License GPLv3+: GNU GPL version 3 or later, see . .br This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. .SH "SEE ALSO" The full documentation for .B ndselect is maintained as a Texinfo manual. If the .B info and .B ndselect programs are properly installed at your site, the command .IP .B info numdiff .PP should give you access to the complete manual. numdiff-5.9.0/docs/numdiff.txt0000644000175000017500000056303013054341114015625 0ustar paologpaologNumdiff User Manual 1 Copying 2 Acknowledgments 3 Overview 3.1 Output format 3.2 Overview mode 3.3 Output of the filter 3.4 Raw output 4 Installing 5 Invoking numdiff 6 Selecting lines and fields for the comparison 7 Invoking ndselect 8 Using the filter of numdiff 9 Warnings Appendix A GNU Free Documentation License Index Numdiff User Manual ******************* _"...und der eignen Kraft vertrauend steigt ein frei Geschlecht empor!"_ This manual describes how to install and use Numdiff, a program which compares putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in *note GNU Free Documentation License::. 1 Copying ********* Numdiff (also written numdiff) is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Numdiff 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 . 2 Acknowledgments ***************** I want to thank Mr. Norman Clerman for several suggestions he gave me to improve the readability and the effectiveness of the output produced by Numdiff. He also pointed out the need to implement a filter to resynchronize the lines between two files in case of addition or deletion of one or more lines. I have to give him credit for the urge to prepare the versions 4.x and 5.x of Numdiff. Moreover, I want to thank my friends Mariapia Palombaro, since she removed some errors while reviewing the first version of this document, and Paolo Caramanica, who suggested me to add more information to the output of the option '-S'. 3 Overview ********** Computer users often find occasion to ask how two files differ. Perhaps one file is a newer version of the other file. Or maybe the two files started out as identical copies but were changed by different people. There are several ways to look at the differences between two files. One way consists in looking at the series of lines that were deleted from, inserted in, or changed in one file to produce the other file. The well-known 'diff' program compares two files line by line, finds groups of lines that differ, and reports each group of differing lines. Without particular options, when comparing lines the 'diff' program considers any change in the amount or in the type of the characters as a difference. However, trough some command line options the user can suppress the output of certain kinds of differences that are not important to him. For instance, 'diff' provides options to ignore differences in the amount of white space between words or lines, or differences in alphabetic case. Another way to look at the differences between two files consists in considering the words that were deleted from, inserted in, or changed in one file to produce the other file. Here "word" refers to a sequence of non white-space characters delimited by a couple of white-spaces, one before and the other one after the word. The 'wdiff' program by Franc,ois Pinard compares words in two files and reports the differences. Finally, one can regard the differences between two files as a sequence of pairs of differing bytes. The 'cmp' program reports the differences between two files byte by byte, instead of line by line or word by word. As a result, it is often more useful than 'diff' or 'wdiff' for comparing binary files. However, none of these approaches turns out to be good when you want to compare a couple of text files composed partially or entirely by numerical fields. In such a case what you want to obtain usually is a list of the numerical fields in the second file which *numerically* differ from the corresponding fields in the first file. But, while a number can be written using different notations, programs like 'diff' or 'wdiff' can not recognize whether a difference between two numeric fields is only due to the notation or is actually a difference of numerical values. For instance, 11.23 and 11.2300000 are the same number but represented in different ways. If you are interested in the numerical values, the difference in the representation is not meaningful and then should be ignored. However, 'diff' and 'wdiff' always consider the previous one as an actual difference: there is no way for you to tell these programs to ignore it. Another example of this type is given by 98765.4321 and 9.87654321E04. Here the difference is only due to the use of the scientific notation in place of the ordinary decimal notation. In addition, depending on your country you could stick to different conventions in writing numbers. For example, the amount "three hundred millions and fifty-two thousands of dollars and forty-six cents" is usually written by an Italian accountant as 300.052.000,46$ while an American accountant would write 300,052,000.46$. Of course, 300.052.000,46$ and 300,052,000.46$ represent the same amount of money but 'diff' and 'wdiff' would report a difference, which probably is not what you want in such a case. Lastly, sometimes you could wish to ignore even differences in numerical values as long as they do not exceed a certain threshold. In other words, you could desire to suppress the report of all "small" numerical differences. For example, it could happen that you want to ignore all numerical differences whose absolute value is not greater than 0.0001. If this is the case, then the numerical fields 33 and 33.00009 should be considered equal, while 33 and 33.00011 should be reported as different. However, 'diff' and 'wdiff' can not be used to ignore small numerical differences, since they do not even know what a numerical difference is. These are the reasons why I decided to implement a new program with the capability to appropriately compare files containing numerical fields. In writing this program I was inspired by 'ndiff', a GPL'ed software by Nelson H. Baabe of the Salt Lake City University. 'ndiff' is actually a good tool, and I used it for a while. But I did not completely like the way it works, and so 'numdiff' was conceived. Although 'ndiff' inspired 'numdiff', they are completely different from the viewpoint of the source code: 'numdiff' has been entirely written from scratch with the addition of code coming from GNU bc, GNU diff and GNUlib. In addition, the last versions of Numdiff offer much more features than 'ndiff' does. 'numdiff' can be used to compare putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. 'numdiff' takes two mandatory arguments, the paths of the two files to compare, and, after splitting them into lines and the lines into fields according to a given list of field delimiters, it compares every field of every line of the first file with the corresponding field of the second file. What _corresponding_ here exactly means depends on the options passed to the program on the command line. With no options, corresponding means the field of the second file at the same position, where position refers both to the line number and to the location within the line. If the compared fields are both legal numerical values, then 'numdiff' performs a numerical comparison between them, otherwise it performs a literal comparison, i.e. the usual byte-by-byte comparison. In case of literal comparison, two fields are regarded as equal if they are formed by the same sequence of characters. In case of numerical comparison and without specific command line options, two fields are regarded as equal if their numerical difference is zero. Mind that, if you do not explicitly specify a list of field delimiters by means of the option '-s' or '-D', 'numdiff' takes as field delimiters the characters newline ('\n', ASCII code 0x0A), horizontal tabulation ('\t', ASCII code 0x09), and blank (' ', ASCII code 0x20). For example, if the file 'list1' contains the data accident 123 23Joshua 34.55 +3+4i water dog -3455.321 cat 2.345678e-9 .0005-6.23e2i and file 'list2' contains the data Accident 123 23456 34.5500 +3.0001+4i dog -3455.320098 Cat +2.345678e-9 -6.23e2i $$$ A new line then the output of the command 'numdiff list1 list2' will be: ---------------- ##1 #:1 <== accident ##1 #:1 ==> Accident @ @@ ##1 #:3 <== 23Joshua ##1 #:3 ==> 23456 @ @@ ##1 #:5 <== +3+4i ##1 #:5 ==> +3.0001+4i @ Absolute error = 1.0000000000e-4, Relative error = 2.0000000000e-5 ##1 #>6 <== water ##1 ==> @ Line 1 in file "list2" is shorter than expected! ---------------- ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 ##2 #:3 <== cat ##2 #:3 ==> Cat @ @@ ##2 #:5 <== .0005-6.23e2i ##2 #:5 ==> -6.23e2i @ Absolute error = 5.0000000000e-4, Relative error = 8.0256821830e-7 ##2 <== ##2 #>6 ==> $$$ @ Line 2 in file "list1" is shorter than expected! ---------------- ##3 <== ##3 #>1 ==> A new line @ Line 3 in file "list1" is shorter than expected! ---------------- <== ##4 ==> +++ File "list1" differs from file "list2" At the same time 'numdiff' will print the following error message on stderr: *** End of file "list1" reached while trying to read line 4. File "list2" has more lines than file "list1", line 4 is the last one read from file "list2" It is worth remarking that 'numdiff' can recognize complex numbers, provided that they are written in the form a+bi or a-bi with no extra characters between the values a, b and the sign + or - (the symbol i, used to represent the imaginary unit, can be changed by a suitable command line option, *note Invoking numdiff::). Do not worry if you do not know what complex numbers are: probably you will never manage files containing complex numbers, thus you can live happily without them. :) We consider now an example which shows how Numdiff can resynchronize the lines between two files in case of addition or deletion of one or more lines. The versions of Numdiff prior to 5 did not work well if one of the two files to compare contains in the middle some lines more or less than the other one. For instance, if you have one file that is 1000 lines long that you are comparing to a second file 1001 lines long, and except for that one extra line, located, let us say, at line 500, the files are identical, then 'numdiff' version 4.x does *not* show only the one line difference: once the files are out of synchronization 'numdiff' 4.x reports every line as different. Since version 5 it is possible in such cases to activate a filter which handles additions and deletions of lines. There are several options ruling how the filter actually works, and I will give later a detailed explanation on how to use them to obtain each time the wished result. The simplest way to activate the filter consists in using the option '-z @'. If 'bill1' and 'bill2' are given by Month Expenses ------------------------- Jan09 $ 233.56 Feb09 $ 850.77 Mar09 $ 12.55 Apr09 $ 524.00 May09 $ 78.25 Jun09 $ 230.00 Jul09 $ 443.10 Aug09 $ 67.65 Sep09 $ 10.00 Oct09 $ 201.45 Nov09 $ 110.00 Dec09 $ 200.27 ------------------------- Total $ 2961.60 and Month Expenses Jan09 $ 234.00 Mar09 $ 13.00 May09 $ 78.25 Jul09 $ 443.10 Sep09 $ 10.00 Nov09 $ 110.00 Jan10 $ 200.00 ------------------------- Total $ 1088.35 respectively, then the differences between the two files are: * the insertion of the separator ------------------------- in 'bill1' before the list of the months, * the deletion in 'bill2' of the lines related to the expenses for the months February, April, June, August, October, December, * small changes in 'bill2' to the expenses of the months January 2009 and March, * the presence in 'bill2' of an entry for January 2010 just before the separator -------------------------, * the addition of an empty line to 'bill2' after the separator -------------------------, * and the different values for the total sum of the expenses. The output of the command 'numdiff -z @ -V bill1 bill2' (I have added here the option '-V' to let Numdiff show which couples of lines it is comparing each time) shows exactly the expected differences: ---------------- ##2 <== ------------------------- ==> ---------------- ##3 <== Jan09 $ 233.56 ##2 ==> Jan09 $ 234.00 ##3 #:3 <== 233.56 ##2 #:3 ==> 234.00 @ Absolute error = 4.4000000000e-1, Relative error = 1.8838842268e-3 ---------------- ##4 <== Feb09 $ 850.77 ==> ---------------- ##5 <== Mar09 $ 12.55 ##3 ==> Mar09 $ 13.00 ##5 #:3 <== 12.55 ##3 #:3 ==> 13.00 @ Absolute error = 4.5000000000e-1, Relative error = 3.5856573705e-2 ---------------- ##6 <== Apr09 $ 524.00 ==> ---------------- ##8 <== Jun09 $ 230.00 ==> ---------------- ##10 <== Aug09 $ 67.65 ==> ---------------- ##12 <== Oct09 $ 201.45 ==> ---------------- ##14 <== Dec09 $ 200.27 ##8 ==> Jan10 $ 200.00 ##14 #:1 <== Dec09 ##8 #:1 ==> Jan10 @ @@ ##14 #:3 <== 200.27 ##8 #:3 ==> 200.00 @ Absolute error = 2.7000000000e-1, Relative error = 1.3500000000e-3 ---------------- <== ##10 ==> ---------------- ##16 <== Total $ 2961.60 ##11 ==> Total $ 1088.35 ##16 #:3 <== 2961.60 ##11 #:3 ==> 1088.35 @ Absolute error = 1.8732500000e+3, Relative error = 1.7211834428e+0 +++ File "bill1" differs from file "bill2" Looking at the displayed report we see that: * the second line of file 'bill1', i.e. the one containing the separator, has no correspondance, or, if you prefer, has been deleted from file 'bill2'. * The lines related to the months January and March 2009 have been slightly modified in 'bill2', namely the values of the expenses are slightly different. Notice that the line with the expenses for January 2009 is the third one in file 'bill1' and the second one in file 'bill2'. This information is printed by Numdiff in the form ##3 <== Jan09 $ 233.56 ##2 ==> Jan09 $ 234.00 Analogously, ##5 <== Mar09 $ 12.55 ##3 ==> Mar09 $ 13.00 says that the line for March is the fifth one in 'bill1' and the third one in 'bill2'. * The line related to the total amount of the expenses appears also differently in the two files, since the amount of the expenses is different. Notice that this line is the 16th one in file 'bill1' and the 11th one in file 'bill2'. * The lines related to the months February, April, June, August and October, i.e. the lines no. 4, 6, 8, 10, and 12 of 'bill1', are not present in 'bill2'. * The line of 'bill1' with the expenses for December 2009 is replaced in 'bill2' by the line containing the value of the expenses for January 2010. * The tenth line of 'bill2', i.e. the empty line after the separator, is not present in 'bill1'. With respect to 'bill1' this line represents then an addition. If you compare 'bill1' and 'bill2' without using the option '-z @', the result is completely misleading. This is the output of 'numdiff -V bill1 bill2': ---------------- ##2 <== ------------------------- ##2 ==> Jan09 $ 234.00 ##2 #:1 <== ------------------------- ##2 #:1 ==> Jan09 @ @@ ##2 <== ##2 #>2 ==> $ 234.00 @ Line 2 in file "bill1" is shorter than expected! ---------------- ##3 <== Jan09 $ 233.56 ##3 ==> Mar09 $ 13.00 ##3 #:1 <== Jan09 ##3 #:1 ==> Mar09 @ @@ ##3 #:3 <== 233.56 ##3 #:3 ==> 13.00 @ Absolute error = 2.2056000000e+2, Relative error = 1.6966153846e+1 ---------------- ##4 <== Feb09 $ 850.77 ##4 ==> May09 $ 78.25 ##4 #:1 <== Feb09 ##4 #:1 ==> May09 @ @@ ##4 #:3 <== 850.77 ##4 #:3 ==> 78.25 @ Absolute error = 7.7252000000e+2, Relative error = 9.8724600639e+0 ---------------- ##5 <== Mar09 $ 12.55 ##5 ==> Jul09 $ 443.10 ##5 #:1 <== Mar09 ##5 #:1 ==> Jul09 @ @@ ##5 #:3 <== 12.55 ##5 #:3 ==> 443.10 @ Absolute error = 4.3055000000e+2, Relative error = 3.4306772908e+1 ---------------- ##6 <== Apr09 $ 524.00 ##6 ==> Sep09 $ 10.00 ##6 #:1 <== Apr09 ##6 #:1 ==> Sep09 @ @@ ##6 #:3 <== 524.00 ##6 #:3 ==> 10.00 @ Absolute error = 5.1400000000e+2, Relative error = 5.1400000000e+1 ---------------- ##7 <== May09 $ 78.25 ##7 ==> Nov09 $ 110.00 ##7 #:1 <== May09 ##7 #:1 ==> Nov09 @ @@ ##7 #:3 <== 78.25 ##7 #:3 ==> 110.00 @ Absolute error = 3.1750000000e+1, Relative error = 4.0575079872e-1 ---------------- ##8 <== Jun09 $ 230.00 ##8 ==> Jan10 $ 200.00 ##8 #:1 <== Jun09 ##8 #:1 ==> Jan10 @ @@ ##8 #:3 <== 230.00 ##8 #:3 ==> 200.00 @ Absolute error = 3.0000000000e+1, Relative error = 1.5000000000e-1 ---------------- ##9 <== Jul09 $ 443.10 ##9 ==> ------------------------- ##9 #:1 <== Jul09 ##9 #:1 ==> ------------------------- @ @@ ##9 #>2 <== $ 443.10 ##9 ==> @ Line 9 in file "bill2" is shorter than expected! ---------------- ##10 <== Aug09 $ 67.65 ##10 ==> ##10 #>1 <== Aug09 $ 67.65 ##10 ==> @ Line 10 in file "bill2" is shorter than expected! ---------------- ##11 <== Sep09 $ 10.00 ##11 ==> Total $ 1088.35 ##11 #:1 <== Sep09 ##11 #:1 ==> Total @ @@ ##11 #:3 <== 10.00 ##11 #:3 ==> 1088.35 @ Absolute error = 1.0783500000e+3, Relative error = 1.0783500000e+2 ---------------- ##12 <== Oct09 $ 201.45 ==> *** End of file "bill2" reached while trying to read line 12. File "bill1" has more lines than file "bill2", line 12 is the last one read from file "bill1" +++ File "bill1" differs from file "bill2" Numdiff compares now the first, second, third line of 'bill1' with the first, second, third line of 'bill2', and so on. But probably this is not what you want in such a case: what is reasonable here is to compare entries related to the same month and not lines having the same location, i.e. the same line number. Numdiff offers also an option to run just the filter and see how it resynchronizes the two given files without performing any comparison of corresponding lines. The output of 'numdiff -z @ -f bill1 bill2' is Month Expenses Month Expenses ------------------------- < Jan09 $ 233.56 Jan09 $ 234.00 Feb09 $ 850.77 < Mar09 $ 12.55 Mar09 $ 13.00 Apr09 $ 524.00 < May09 $ 78.25 May09 $ 78.25 Jun09 $ 230.00 < Jul09 $ 443.10 Jul09 $ 443.10 Aug09 $ 67.65 < Sep09 $ 10.00 Sep09 $ 10.00 Oct09 $ 201.45 < Nov09 $ 110.00 Nov09 $ 110.00 Dec09 $ 200.27 | Jan10 $ 200.00 ------------------------- ------------------------- > Total $ 2961.60 Total $ 1088.35 +++ File "bill1" differs from file "bill2" and shows that the filter is doing its job in the right way, associating the lines according to the month and not to the line number. Running just the filter is extremely useful in all situations when you are not sure if the filter is working as you wish. You have indeed to instruct the filter in the right way to let it work correctly, and this requires the use of different options depending on the structure of the files to compare. Since guessing the right options can be sometimes tricky, running just the filter and see the result is the best way to be certain that you are setting up everything correctly. Later, *note Filtering::, I will explain in detail * what the filter does behind the scenes to understand if and how it has to resynchronize the files to compare, * and how the related options affect the action of the filter. By the way, it is even possible to use '-f' without any other additional option for the filter, like in 'numdiff -f bill1 bill2', but the result is more or less the same you would obtain by performing a byte-by-byte comparison with removal of the field delimiters. The option '-f' can be followed by an argument in the form of an integer number whose meaning will be explained later, *note Use of the option -f::. Even if the output of 'numdiff' is supposed to be self-explanatory, in the next section I will explain in details all you should know about it. 3.1 Output format ================= Let us go back to our first example. If the files 'list1' and 'list2' contain the data accident 123 23Joshua 34.55 +3+4i water dog -3455.321 cat 2.345678e-9 .0005-6.23e2i and Accident 123 23456 34.5500 +3.0001+4i dog -3455.320098 Cat +2.345678e-9 -6.23e2i $$$ A new line respectively, then the output of the command 'numdiff list1 list2' will be: ---------------- ##1 #:1 <== accident ##1 #:1 ==> Accident @ @@ ##1 #:3 <== 23Joshua ##1 #:3 ==> 23456 @ @@ ##1 #:5 <== +3+4i ##1 #:5 ==> +3.0001+4i @ Absolute error = 1.0000000000e-4, Relative error = 2.0000000000e-5 ##1 #>6 <== water ##1 ==> @ Line 1 in file "list2" is shorter than expected! ---------------- ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 ##2 #:3 <== cat ##2 #:3 ==> Cat @ @@ ##2 #:5 <== .0005-6.23e2i ##2 #:5 ==> -6.23e2i @ Absolute error = 5.0000000000e-4, Relative error = 8.0256821830e-7 ##2 <== ##2 #>6 ==> $$$ @ Line 2 in file "list1" is shorter than expected! ---------------- ##3 <== ##3 #>1 ==> A new line @ Line 3 in file "list1" is shorter than expected! ---------------- <== ##4 ==> +++ File "list1" differs from file "list2" 'numdiff' prints a report on the standard output for every field of the first file which differs from the corresponding field of the second file. This report indicates first the locations of the fields, namely the numbers of the lines where the fields appear and their positions within the line. The position in the line is "1" for the first field of a line, "2" for the second field, "3" for the third one, and so on: fields are numerated starting from the left hand of the line and proceeding towards the right hand. For each report the line number is introduced by the symbol "##", while the field number by "#:". Then 'numdiff' shows in what the difference consists. For example, ##1 #:1 <== accident ##1 #:1 ==> Accident @ @@ means that the first field of the first line is "accident" in the first file, while in the second file it appears as "Accident". This difference could be then canceled by removing "accident" from the first file and inserting "Accident" in place of it. The arrows "<==" and "==>" try to visualize this idea. Analogously, ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 means that the second field of the second line is "-3455.321" in the first file and "-3455.320098" in the second one. Since the contents of the field are numerical in both files, 'numdiff' also prints the absolute and relative errors. The absolute error (or absolute difference) is given by the absolute value of the difference between the values appearing in the two files. The relative error (or relative difference) is actually defined in a more complicated way. If _n1_ is the value appearing in the first file and _n2_ is the value in the second file, then the absolute error is given by the formula _A=|n1-n2|_, while the relative error _R_ is given by: * _R = 0_ if _n1_ and _n2_ are equal, * _Inf_ (infinity) if _n2_ differs from _n1_ and at least one of them is zero, * _R = A/ min(|n1|, |n2|)_ if _n1_ and _n2_ are both non zero and _n2_ differs from _n1_. _min(|n1|, |n2|)_ denotes the minimum between the absolute value of _n1_ and the absolute value of _n2_. With these definitions of absolute and relative error it turns out that _A(n2, n1) = A(n1, n2)_ and _R(n2, n1) = R(n1, n2)_. In other words, the absolute/relative error does not change if you only change the order of the compared values. Since version 5 it is actually possible to let Numdiff compute the relative error always with respect to the value from the first file or always with respect to the value from the second file, instead of using the preceding formula. This can be done through the option '-F', *note Alternative formulas for the computation of the relative difference::. If at least one of the compared fields is not numerical, then the output line reporting absolute and relative errors is replaced by the separator: @ @@ It can happen that a line in one of the two files to compare contains more fields than the corresponding line of the other file. If this is the case, 'numdiff' reports this difference by telling that a certain line (identified by its line number) appears to be shorter than expected, just as in ##1 #>6 <== water ##1 ==> @ Line 1 in file "list2" is shorter than expected! or in ##3 <== ##3 #>1 ==> A new line @ Line 3 in file "list1" is shorter than expected! In addition, 'numdiff' shows the tail of the longer line, using the notation "#>n" to indicate the number n of the first field of the longer line for which there is no corresponding field in the shorter line. For example, ##1 #>6 <== water ##1 ==> @ Line 1 in file "list2" is shorter than expected! means that none of the fields of the first line starting from the sixth one has a corresponding field in the second file ('list2'). In this context, the symbol <<*>> (if it appears) is used to denote the End-Of-File, i.e. a line or the tail of a line which is located at the end of the corresponding file and does not have a terminating _newline_ character. It can also happen that one of the two files to compare has less lines than the other one. In this case, if no special option is passed to the program, 'numdiff' prints the number of the first line which appears in only one of the two files and a message on the standard error telling in which of the two files the end has been prematurely reached: *** End of file "list1" reached while trying to read line 4. File "list2" has more lines than file "list1", line 4 is the last one read from file "list2" Unless the option '-q' is used (*note Invoking numdiff::), 'numdiff' prints to the standard output a message reporting the final status of the comparison. This message says either the two files are equal or they are different, just as in the example we are considering: +++ File "list1" differs from file "list2" 3.2 Overview mode ================= Since version 5.6 an alternative way to display the differences between two files is available, which can be activated through the option '-O'. If this option is present on the command line, 'numdiff' prints a side-by-side report instead of the usual one. For example, if 'sheet1' contains the text A 1 1 B 2 4 C 3 9 D 4 16 E 5 25 F 6 36 G 7 49 H 8 64 I 9 81 J 10 100 and 'sheet2' the following lines A 1 1 B 2 4 C 3.3 9.03 D 4 16 E 5.5 25.05 F 6.6 36 G 7.7 49.49 H 8 64 I 9.9 81.09 then 'numdiff -O sheet1 sheet2' prints this report A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 :!:C 3.3 9.03 D 4 16 D 4 16 E 5 25 :!:E 5.5 25.05 F 6 36 :!:F 6.6 36 G 7 49 :!:G 7.7 49.49 H 8 64 H 8 64 I 9 81 :!:I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" On the left side you can see the lines coming from the file specified as first on the command line, i.e. 'sheet1', on the right side the lines from the second file of the command line, in this case 'sheet2'. In the middle there is a gutter which contains one of these markers: 'white spaces' The corresponding lines are in common. That is, either the lines are identical, or the difference is ignored because of one of the options '-s', '-D', '-I', '-X', '-a', '-r', '-P', or '-N'. ':!:' The corresponding lines have at least one field which differs. ':<:' The files differ and only the first file contains the line. ':>:' The files differ and only the second file contains the line. In the case of 'sheet1' and 'sheet2' a message is printed after the report saying that the end of the second file has been prematurely reached. The two files do not have indeed the same number of lines and the filter has not been activated. The option '-O' can take an optional argument, which allows to set the width of the output and eventually to suppress common lines, *note Invoking numdiff::. The default value for the width of the side-by-side report is 130. No wonder then that the command 'numdiff -O40 sheet1 sheet2' displays a report with shorter lines: A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 :!: C 3.3 9.03 D 4 16 D 4 16 E 5 25 :!: E 5.5 25.05 F 6 36 :!: F 6.6 36 G 7 49 :!: G 7.7 49.49 H 8 64 H 8 64 I 9 81 :!: I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" A negative argument makes that only the differences are listed in the side-by-side report, as shown by the output of the command 'numdiff -O40 sheet1 sheet2': C 3 9 :!: C 3.3 9.03 E 5 25 :!: E 5.5 25.05 F 6 36 :!: F 6.6 36 G 7 49 :!: G 7.7 49.49 I 9 81 :!: I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" If you set the width of the report to a too small value, it can happen that some or even all lines from the compared files appear truncated as in the output of 'numdiff -O24 sheet1 sheet2': A 1 A 1 B 2 B 2 C 3 :!: C 3.3 D 4 D 4 E 5 :!: E 5.5 F 6 :!: F 6.6 G 7 :!: G 7.7 H 8 H 8 I 9 :!: I 9.9 J 10 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" If you set the width of the report to a very small value, Numdiff ignores it and uses the default value, i.e. 130. Notice that the numeric argument must immediately follow the option '-O', intermediate spaces are not allowed. This is also the case for the optional argument of '-f', while the options of Numdiff which require a mandatory argument permit the presence of intermediate spaces between them and the argument. The option '-O' can be used together with any other option of Numdiff except for '-f', '-q', '-U', '-E', '-V' and '-b'. When '-O' is in use, '-U', '-E', '-V' and '-b' are ignored. If '-q' is present on the command line together with '-O', then '-O' is ignored. Finally, if both '-f' and '-O' are present, then the behavior depends on the order: the option which appears first on the command line is the one which matters. Therefore, the command 'numdiff -O40 -f sheet1 sheet2' displays the same report as 'numdiff -O40 sheet1 sheet2', while the output of 'numdiff -f -O40 sheet1 sheet2' is given by A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 | C 3.3 9.03 D 4 16 D 4 16 E 5 25 | E 5.5 25.05 F 6 36 | F 6.6 36 G 7 49 | G 7.7 49.49 H 8 64 H 8 64 I 9 81 | I 9.9 81.09 J 10 100 < +++ File "sheet1" differs from file "sheet2" and coincides then with the output of 'numdiff -f sheet1 sheet2'. The option '-O' can be used together with the filter to cope with the addition/deletion of lines. If the file 'sheet3' contains the text A 1 1 C 3.3 9.03 E 5.5 25.05 G 7.7 49.49 I 9.9 81.09 J 10 100.00 K 0 0.02 then 'numdiff -O40 sheet1 sheet3' prints a wrong report, as in the example with files 'bill1' and 'bill2': A 1 1 A 1 1 B 2 4 :!: C 3.3 9.03 C 3 9 :!: E 5.5 25.05 D 4 16 :!: G 7.7 49.49 E 5 25 :!: I 9.9 81.09 F 6 36 :!: J 10 100.00 G 7 49 :!: K 0 0.02 H 8 64 :<: *** End of file "sheet3" reached while trying to read line 8. File "sheet1" has more lines than file "sheet3", line 8 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet3" On the other hand, the presence of '-z @' makes Numdiff always compare fields of corresponding lines, as shown by the output of the command 'numdiff -O40 -z @ sheet1 sheet3': A 1 1 A 1 1 B 2 4 :<: C 3 9 :!: C 3.3 9.03 D 4 16 :<: E 5 25 :!: E 5.5 25.05 F 6 36 :<: G 7 49 :!: G 7.7 49.49 H 8 64 :<: I 9 81 :!: I 9.9 81.09 J 10 100 J 10 100.00 :>: K 0 0.02 +++ File "sheet1" differs from file "sheet3" Side-by-side format is easy to read, but it has limitations. It generates much wider output than usual, and truncates lines that are too long to fit. Also, it relies on lining up output quite heavily, so its output looks particularly bad if you use varying width fonts, nonstandard tab stops, or nonprinting characters. 3.3 Output of the filter ======================== The output produced just by running the filter (option '-f') is a side-by-side difference listing of the compared files like the one displayed by GNU sdiff. The files are listed in two columns with a gutter between them. The gutter contains one of the following markers: 'white space' The corresponding lines are in common. That is, either the lines are identical, or the difference is ignored because of one of the options '-s', '-D', '-I', '-X', '-z', or '-Z'. '|' The corresponding lines differ, and they are either both complete or both incomplete. '<' '(' The files differ and only the first file contains the line. '>' ')' The files differ and only the second file contains the line. '\' The corresponding lines differ, and only the first line is incomplete. '/' The corresponding lines differ, and only the second line is incomplete. An input line is incomplete if its last character is not a newline. This can happen only if the line is the last one of its file. When an output line of the side by side difference listing represents two differing lines, one might be incomplete while the other is not. In this case the gutter is marked '\' if the line from the first file is incomplete, '/' if the line from the second file is it. Like '-O', the option '-f' can take an optional argument which allows to set the width of the output and eventually to suppress common lines, *note Invoking numdiff:: and *note Use of the option -f::. More generally, the user can always make 'numdiff' avoid to print, partially or totally, the messages that it would otherwise send to standard output. This can be achieved by some suitable command line options, *note Invoking numdiff::. 3.4 Raw output ============== Since version 5.9 Numdiff can report the results of the comparison of two files in a particularly compact format, which can be easily parsed by other programs. This _raw_ format is chosen by Numdiff whenever the user requests it through the command line option '--raw'. Below you can see an example of raw output in the case of the comparison of the files 'list1' and 'list2' from section *note Output format::: 1:1:1:1:*:*:accident ==> Accident 1:1:3:3:*:*:23Joshua ==> 23456 1:1:5:5:1.0000000000e-4:2.0000000000e-5:+3+4i ==> +3.0001+4i 1:1:6:*:water 2:2:2:2:9.0200000000e-4:2.6104672633e-7:-3455.321 ==> -3455.320098 2:2:3:3:*:*:cat ==> Cat 2:2:5:5:5.0000000000e-4:8.0256821830e-7:.0005-6.23e2i ==> -6.23e2i 2:2:*:6:$$$ 3:3:*:1:A new line *:4 +++ File "list1" differs from file "list2" The raw format is not at all convenient for humans. It has been provided only for being used by the forthcoming graphic user interface of Numdiff (yes, Numdiff will have a GUI sometime in the future!). 4 Installing ************ To successfully compile, build and install Numdiff some tools are required. The first one is an ANSI C compiler. This compiler should at least accept the option '-o' to write its output to a specified file, the option '-D' for macros predefinition, the option '-l' to search for a specified library, and the options '-I' and '-L' to add a given directory to the search path for include and library files respectively. In addition, you need a POSIX implementation of the 'make' utility (I used both GNU make and smake by Joerg Schilling to compile Numdiff) and a POSIX implementation of the commands 'rm' and 'find'. At last, you need a proper installation of GNU Texinfo (in order to install the info documentation) and a shell sh-compatible. Numdiff has been successfully compiled and tested on: * Slackware(R) GNU/Linux 10.2 with the version 3.3.6 of the GNU C Compiler (GCC), * Slackware GNU/Linux 11 with GCC 3.4.6, * Slackware GNU/Linux 12.2 with GCC 4.2.4, * Slackware GNU/Linux 13 with GCC 4.3.3, * Debian(R) GNU/Linux 4.0 with GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21), * Debian GNU/Linux 6.0.3 with GCC 4.4.5 (Debian 4.4.5-8), * Debian GNU/Linux 7.1 with GCC 4.7.2 (Debian 4.7.2-5), * Debian GNU/Linux 8.6 with GCC 4.9.2 (Debian 4.9.2-10), * SunOS(R) 5.8 with GCC 2.95.3, and * SunOS 5.10 (i386) with the version 5.9 of the Sun C compiler. Configuration, building and installation of Numdiff can be performed through the standard three steps: ./configure make make install If you leave enabled the Natural Language Support and you also want to install the localization files (at the moment only the Italian localization is supplied), then after 'make' you will have to type and run make install-nls By default, 'make install' will install all the files in '/usr/local/bin', '/usr/local/info' etc. You can specify an installation prefix other than '/usr/local' using the option '--prefix' in the 'configure' step, for instance '--prefix=$HOME': ./configure --prefix=$HOME For better control, you can use the options '--bindir', '--infodir', and so on. Type './configure --help' to obtain the complete list of all available options. The documentation files (including a full User Manual available in HTML, PDF and plain ASCII text format) will always be put in 'DOCDIR/numdiff', where DOCDIR is the path specified by the option '--docdir' or, if this option has not been given to 'configure', 'PREFIX/local/doc'. Here PREFIX is the installation prefix specified by the option '--prefix' or the default '/usr/local'. Once Numdiff has been installed you can remove all files related to Numdiff by a simple 'make uninstall'. If you have also installed the localization files trough 'make install-nls', use 'make uninstall-nls' in place of 'make uninstall' to remove them too. Between the options accepted by 'configure' there are '--enable-debug', '--enable-optimization', '--enable-nls' and '--enable-gmp'. The option '--enable-debug' turns on debugging when compiling the source code. This is obtained by passing to the compiler the '-g' option, but you can change this default debugging flag (which could not even be recognized by your compiler) by setting the environment variable 'DBGFLAGS' before launching 'configure'. The option '--enable-optimization' turns on basic optimization when compiling the source code. This is obtained by passing to the compiler the '-O' option, but you can change this default flag (which could not even be recognized by your compiler) by setting the environment variable 'OPTFLAGS' before launching 'configure'. The option '--enable-nls' turns on Natural Language Support. You do not need to use it explicitly since Natural Language Support is enabled by default. To disable it, use '--disable-nls'. Disabling Natural Language Support is suggested whenever you want to install Numdiff on a system where the GNU gettext library is not present. In this case the installation of Numdiff can be accomplished, for example, through ./configure --disable-nls make make install Since version 5.2.0 Numdiff uses to perform all computations the GNU Multiple Precision Arithmetic Library (also called GNU MP or GMP), if this library is available at build-time. The old internal support for multiple precision arithmetic is a fall-back in case GNU MP is absent. However, it is possible to use the internal support for multiple precision arithmetic even if GNU MP is available: it is sufficient to pass the option '--enable-gmp=no' or '--disable-gmp' to the configure script before building the program, like in ./configure --disable-gmp make make install Enabling the old internal support for multiple precision arithmetic is deprecated, *note with GNU MP is better::. The latest version of GNU MP is available at . See the GNU MP web page at for up-to-date information on GNU MP. 5 Invoking numdiff ****************** *SYNOPSIS* numdiff -h|--help|-v|--version or numdiff [-s IFS][-D DELIMS][-a THRVAL[:RANGE|:RANGE1:RANGE2]] [-r THRVAL[:RANGE|:RANGE1:RANGE2]][-2][-F NUM][-# NUM][-P][-N][-I] [-c CURRNAME][-d C1C2][-t C1C2][-g N1N2][-p C1C2][-n C1C2][-e C1C2] [-i C1C2][-X 1:RANGE][-X 2:RANGE][-E][-U][-b][-V][-O[NUM]][--raw][-q][-S] [-z 1:RANGE][-z 2:RANGE][-Z 1:RANGE][-Z 2:RANGE][-m][-H][-f[NUM]] [-T][-B][-l PATH][-o PATH] FILE1 FILE2 where FILE1 and FILE2 are the names of the two files to compare and RANGE, RANGE1 and RANGE2 stay for a positive integer value or for a range of integer values, like '1-', '3-5' or '-7'. In the first case 'numdiff' prints a short help (not so short actually :)) or/and version number, Copyright, License notice, NO-Warranty disclaimer, and some information about the way it was built. In the second case 'numdiff' compares the files specified by the two mandatory arguments which follow the list of the options. The complete paths of the files should be given, a directory name is not accepted. In addition, the two arguments cannot refer to the same file but one of them can be -, which refers to stdin. *OPTIONS* '-s, --separators=IFS' Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline). If IFS is prefixed with '1:' or '2:', use the given delimiter set only for the lines from the first or the second file respectively '-D, --delimiters=DELIMS' Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline). If DELIMS is prefixed with '1:' or '2:', use the given delimiter set only for the lines from the first or the second file respectively '-a, --absolute-tolerance=THRVAL[:RANGE|:RANGE1:RANGE2]' Set to THRVAL the maximum absolute difference permitted before two numeric fields are regarded as different (The default value is zero). If a RANGE is given, use the specified threshold only when comparing fields whose indexes lie in RANGE. If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2 '-r, --relative-tolerance=THRVAL[:RANGE|:RANGE1:RANGE2]' Set to THRVAL the maximum relative difference permitted before two numeric fields are regarded as different (The default value is zero). If a RANGE is given, use the specified threshold only when comparing fields whose indexes lie in RANGE. If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2 '-2, --strict' Consider two numerical values as equal only if both absolute and relative difference do not exceed the respective tolerance threshold '-F, --formula=NUM' Use the formula indicated by NUM to compute the relative errors. If NUM is 0 use the classic formula. If NUM is 1 compute the relative errors by considering the values in FILE1 as sample values. If NUM is 2 compute the relative errors by considering the values in FILE2 as sample values. '-#, --digits=NUM' Set to NUM the number of digits in the significands used in multiple precision arithmetic '-P, --positive-differences' Ignore all differences due to numeric fields of the second file that are less than the corresponding numeric fields in the first file '-N, --negative-differences' Ignore all differences due to numeric fields of the second file that are greater than the corresponding numeric fields in the first file '-I, --ignore-case' Ignore changes in case while doing literal comparisons '-c, --currency=CURRNAME' Set to CURRNAME the currency name for the two files to compare. CURRNAME must be prefixed with '1:' or '2:' to specify the currency name only for the first or the second file '-d, --decimal-point=C1C2' Specify the characters representing the decimal point in the two files to compare '-t, --thousands-separator=C1C2' Specify the characters representing the thousands separator in the two files to compare '-g, --group-length=N1N2' Specify the number of digits forming each group of thousands in the two files to compare '-p, --plus-prefix=C1C2' Specify the (optional) prefixes for positive values used in the two files to compare '-n, --minus-prefix=C1C2' Specify the prefixes for negative values used in the two files to compare '-e, --exponent-letter=C1C2' Specify the exponent letters used in the two files to compare '-i, --imaginary-unit=C1C2' Specify the characters representing the imaginary unit in the two files to compare '-X, --exclude=1:RANGE' Select the fields of the first file that have to be ignored '-X, --exclude=2:RANGE' Select the fields of the second file that have to be ignored '-E, --essential' While printing the differences between the two compared files show only the numerical ones '-U, --dummy' While printing the differences between the two compared files neglect all the numerical ones (dummy mode) '-b, --brief' Suppress all messages concerning the differences discovered in the structures of the two files '-V, --verbose' For every couple of lines which differ in at least one field print an header to show how these lines appear in the two compared files '-O, --overview[=NUM]' Display a side by side difference listing of the two files showing which lines are present only in one file, which lines are present in both files but with one or more differing fields, and which lines are identical. If NUM is zero or is not specified, output at most 130 columns per line. If NUM is a positive number, output at most NUM columns per line. If NUM is a negative number, do not output common lines and display at most -NUM columns per line. '--raw' Display the differences between the two compared files in raw format (not very convenient for humans) '-q, --quiet, --silent' Suppress all the standard output '-S, --statistics' Add some statistics to the standard output '-z, --blur-if-numerical=1:RANGE' Select the fields of the first file that have to be blurred during the synchronization procedure only if they turn out to be numeric '-z, --blur-if-numerical=2:RANGE' Select the fields of the second file that have to be blurred during the synchronization procedure only if they turn out to be numeric '-Z, --blur-unconditionally=1:RANGE' Select the fields of the first file that have to be unconditionally blurred during the synchronization procedure '-Z, --blur-unconditionally=2:RANGE' Select the fields of the second file that have to be unconditionally blurred during the synchronization procedure '-m, --minimal' During synchronization try hard to find a smaller set of changes '-H, --speed-large-files' During synchronization assume large files and many scattered small changes '-f, --test-filter[=NUM]' Run only the filter and then show the results of its attempt to synchronize the two files. If NUM is zero or is not specified, output at most 130 columns per line. If NUM is a positive number, output at most NUM columns per line. If NUM is a negative number, do not output common lines and display at most -NUM columns per line. '-T, --expand-tabs' Expand tabs to spaces in output while displaying the results of the synchronization procedure (meaningful only together with option '-O' or '-f') '-B, --binary' Treat both files as binary files (only meaningful under Doz/Windoz) '-l, --warnings-to=PATH' Redirect warning and error messages from stderr to the indicated file '-o, --output=PATH' Redirect output from stdout to the indicated file '-h, --help' Show help message and predefined settings '-v, --version' Show version number, Copyright, Distribution Terms and NO-Warranty *DIAGNOSTICS* The exit status is 1 if the two given files differ, 0 if they are equal, -1 (255) in case of error. *DEFAULT NUMERIC FORMAT (for both files to compare):* Currency name = "" Decimal point = '.' Thousands separator = ',' Number of digits in each thousands group = 3 Leading positive sign = '+' Leading negative sign = '-' Prefix for decimal exponent = 'e' Symbol used to denote the imaginary unit = 'i' *SOME EXPLANATIONS* The options '-U', '-E', '-b', and '-q' are used to hide part of the standard output of the program according to certain rules. The option '-U' triggers the dummy mode. In this mode 'numdiff' does not print the numerical differences. A numerical difference occurs whenever the compared fields turn out to be both of numerical type, but the field from the second file has a value which differs from the one of the field from the first file. The dummy mode is so called since in this mode 'numdiff' does not perform the job for which I created it. The option '-E' triggers the essential mode. In this mode 'numdiff' only prints the numerical differences between the files and, if there are some, the differences in the structure. The latter ones occur either when one of the files contains a line for which there is no corresponding line in the other file, or when the comparison of corresponding lines shows that one of them contains a field for which there exists no corresponding field in the other line. If you are not running any filter or cutting out any fields through the option '-X', then the differences in the structure simply consist either in a different number of lines in the two files, or in a different number of fields on a line. The option '-b' triggers the brief mode. In this mode 'numdiff' does not print the differences in the structure of the two files (see above for an explanation about what differences in the structure are). The option '-q' triggers the quiet mode. In this mode 'numdiff' does not print anything on the standard output. The quiet mode is useful if you only want to know whether a couple of files are equal or not. This information can be obtained by looking at the exit status of the program. The option '-O' activates the overview mode, which makes 'numdiff' print a side-by-side report in the form described in section *note Overview mode::. The optional numeric argument after '-O' must immediately follow, intermediate spaces are not allowed. The option '-O' can be used together with any other option of Numdiff except for '-f', '-q', '-U', '-E', '-V', '-b', and '--raw'. Whenever '-O' is in use, '-U', '-E', '-V' and '-b' are ignored. If '--raw' or '-q' is present on the command line together with '-O', then '-O' is ignored. Finally, if both '-f' and '-O' are present, the behavior of Numdiff will depend on their order: the option which appears first on the command line is the one which matters. The option '-V' triggers the verbose mode. In this mode 'numdiff' produces a richer report by printing an header whenever the compared lines differ. The header shows how and where these lines appear in the compared files. For instance, if the files 'data1' and 'data2' contain the data 12 33 22 44.5 0.008 1.002 221.12 -34.56 water 2101.21 boats and 12 33 22.3 44.5 0.008 1.202 221.12 -34.56 2101.21 boats dogs respectively, then the command 'numdiff -V data1 data2' will print the following output: ---------------- ##2 <== 22 44.5 ##2 ==> 22.3 44.5 ##2 #:1 <== 22 ##2 #:1 ==> 22.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.3636363636e-2 ---------------- ##3 <== 0.008 1.002 ##3 ==> 0.008 1.202 ##3 #:2 <== 1.002 ##3 #:2 ==> 1.202 @ Absolute error = 2.0000000000e-1, Relative error = 1.9960079840e-1 ---------------- ##4 <== 221.12 -34.56 water ##4 ==> 221.12 -34.56 ##4 #>3 <== water ##4 ==> @ Line 4 in file "data2" is shorter than expected! ---------------- ##5 <== 2101.21 boats ##5 ==> 2101.21 boats dogs ##5 <== ##5 #>3 ==> dogs @ Line 5 in file "data1" is shorter than expected! +++ File "data1" differs from file "data2" Mind that the options '-b' and '-V' will be overridden if '-q' is also set. The amount of additional information printed by '-V' is trivially influenced by the options that alter the way 'numdiff' performs the comparisons between fields (for instance '-a', '-r', '-2', '-N', '-P', '-U', '-E', '-I', '-X'). In the headers printed by 'numdiff' in "verbose mode" the symbol <<*>> can appear. This symbol, if present, is always located at the end of a line to mean that the line is at the end of the corresponding file and does not have a terminating *newline* character. The option '-S' adds to the standard output of 'numdiff' a statistical report with the following information: * the number of numeric comparisons the program has done (this quantity, like the successive ones, is influenced by the options '-P' and '-N') and the number of those ones whose outcome is a major (1) numerical difference. * the largest absolute error in the set of major numerical differences together with the corresponding relative error, and the positions of its first occurrences in the compared files, * the largest relative error in the set of major numerical differences together with the corresponding absolute error, and the positions of its first occurrences in the compared files, * the sum and the arithmetic mean of all absolute errors, * the sum and the arithmetic mean of the major absolute errors, * the square root of the sum of the squares of all absolute errors, * the square root of the sum of the squares of the major absolute errors, * the quadratic mean of all absolute errors, and * the quadratic mean of the major absolute errors. The information printed by '-S' is not removed if this option is used together with '-q', and is not influenced by the option '--raw'. The options '-a', '-r', '-2', '-P' and '-N' affect the way 'numdiff' performs the comparisons between numerical values. Without any of these options, 'numdiff' considers two numerical fields as equal if their difference is zero. The option '-a' can be used to make two numerical fields be considered equal as long as their absolute difference does not exceed a certain threshold, which is specified by the argument that follows the '-a' option. This argument can take several forms. The basic form consists of a single numerical value, the extended form adds the specification of one or two ranges of integer values. Independently of the form of the argument, if the absolute difference between two fields does not exceed the given threshold value, the fields are considered equal; otherwise, 'numdiff' prints the difference in its report, unless some other option, for example '-P' or '-N', makes the difference be neglected. If nothing else follows the threshold value, the rule just explained applies to all comparisons between numerical fields. To see this in practice, if the file 'many_columns1' contains the text A 1 1.2 1 0.1 11.0 1.0e-1 B 2 2.4 4 0.4 24.0 1.0e-2 C 3 3.6 9 0.9 39.0 1.0e-3 D 4 4.8 16 1.6 416.0 1.0e-4 and the contents of the file 'many_columns2' are given by A 1.1 1.08 1.01 0.1 11.011 -1.0e-1 B 2.2 2.16 4.04 0.4 24.024 -1.0e-2 C 3.3 3.24 9.09 0.9 39.039 -1.0e-3 D 4.4 4.32 16.16 1.6 416.039 -1.0e-4 then the output of the command 'numdiff -a 0.5 many_columns1 many_columns2' will be +++ Files "many_columns1" and "many_columns2" are equal The highest absolute difference between a field from 'many_columns1' and the corresponding field from 'many_columns2' is given indeed by |4.32 - 4.8| = |-0.48| = 0.48, and then all numeric differences between the two files remain below the threshold value 0.5. On the other hand, the command 'numdiff -a 0.35 many_columns1 many_columns2' prints the report ---------------- ##3 #:3 <== 3.6 ##3 #:3 ==> 3.24 Absolute error = 3.6000000000e-1, Relative error = 1.1111111111e-1 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:3 <== 4.8 ##4 #:3 ==> 4.32 Absolute error = 4.8000000000e-1, Relative error = 1.1111111111e-1 +++ File "many_columns1" differs from file "many_columns2" since the absolute differences |3.24-3.6| = |-0.36| = 0.36, |4.4-4| = |0.4| = 0.4, and |4.32 - 4.8| = 0.48 exceed the value 0.35, while the other differences are below this threshold. If you want that the specified threshold value applies only when comparing some particular fields, you have to use the extended form for the argument of '-a'. This means that after the threshold value one or two ranges of integer numbers must follow, each preceded by a colon (':'). If you specify only one range of numbers after the threshold value, 'numdiff' uses the given threshold only when comparing fields whose positions lie in the specified range. Remember that the positions of the fields on a line are numbered starting from the left hand of the line and proceeding towards the right hand. For example, '-a 0.01:2-5' sets the threshold value to 0.01 only for the comparisons between numerical fields which occupy on their lines a position between the second and the fifth one inclusive. For the other comparisons the threshold value is left unchanged; in particular, it is equal to zero if it has not been explicitly set. If the files 'many_columns1' and 'many_columns2' are the same as before, then the command 'numdiff -a 0.5:3-6 many_columns1 many_columns2' will display the following report ---------------- ##1 #:2 <== 1 ##1 #:2 ==> 1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:2 ==> 2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:7 <== 1.0e-3 ##3 #:7 ==> -1.0e-3 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:7 <== 1.0e-4 ##4 #:7 ==> -1.0e-4 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns2" since the threshold value 0.5 applies now only when comparing fields in third, fourth, fifth and sixth position, while for the other comparisons the threshold value is the default one, i.e. zero. If you want to specify a non null threshold also for the fields in second and seventh position, you can do it by using the option '-a' more times. The command 'numdiff -a 0.5:3-6 -a 0.25:2 -a 4e-3:7 many_columns1 many_columns2' sets the threshold value to 0.25 for the comparisons between the fields in second position, and to 4e-3 for the comparisons of the fields in seventh position. No wonder then, that the command prints exactly this report: ---------------- ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 +++ File "many_columns1" differs from file "many_columns2" Observe that :2 and :7 are abbreviations of :2-2 and :7-7, respectively. It is even possible to use range expressions like 'M-' or '-N'. The first expression means all fields starting from the Mth one (inclusive) till to the end of line, the second selects all fields from the first one till to the Nth one, both inclusive. If you specify two ranges of numbers after the threshold value and they have the same length (the length of a range is the difference between its maximum and its minimum), 'numdiff' uses the given threshold when comparing a field of the first file lying in the first range with the corresponding field of the second file from the second range. For example, '-a 1e-4:3-5:4-6' sets the threshold value to 0.0001 only for the numerical comparisons of the third, fourth, and fifth field of each line from the first file with the fourth, fifth and sixth field respectively of the corresponding line from the second file. For the other comparisons the threshold value is left unchanged and is in particular equal to zero if it has not been explicitly set. This way to restrict the application of a threshold value is useful in conjunction with the option '-X', which makes 'numdiff' ignore one or more fields from one of the compared files. The file 'many_columns3': A I 1.1 1.08 1.01 0.1 11.011 -1.0e-1 B II 2.2 2.16 4.04 0.4 24.024 -1.0e-2 C III 3.3 3.24 9.09 0.9 39.039 -1.0e-3 D IV 4.4 4.32 16.16 1.6 416.039 -1.0e-4 has one column more than the file 'many_columns1', namely the second one. When comparing 'many_columns1' with 'many_columns3' it is natural then to ignore the second column of the second file. This can be achieved by passing the argument 2:2 to the option '-X' (for a full description of the use of this option, *note Restriction of the comparison to particular fields::). Ignoring the second field of each line of 'many_columns3' implies that the fields in the third column of this file are compared with the corresponding fields of the second column of 'many_columns1', the fields in the fourth column of 'many_columns3' are compared with the ones in the third column of 'many_columns1', and so on. Therefore, if you want to set a threshold value only for the comparisons between some particular fields you have to consider that '-X 2:2' makes 'numdiff' compare the first, second, third, fourth, fifth, sixth, and seventh field of each line of 'many_columns1' with the first, third, fourth, fifth, sixth, seventh, and eighth field respectively of the corresponding line of 'many_columns3'. Therefore, the command 'numdiff -X 2:2 -a 0.5:3-6 many_columns1 many_columns3' will use 0.5 as threshold value only when comparing the third, fourth, and fifth field of a line from 'many_columns1' with the fourth, fifth, and sixth field respectively of the corresponding line of 'many_columns3'. This explains why the report of 'numdiff -X 2:2 -a 0.5:3-6 many_columns1 many_columns3' ---------------- ##1 #:2 <== 1 ##1 #:3 ==> 1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:6 <== 11.0 ##1 #:7 ==> 11.011 Absolute error = 1.1000000000e-2, Relative error = 1.0000000000e-3 ##1 #:7 <== 1.0e-1 ##1 #:8 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:3 ==> 2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:6 <== 24.0 ##2 #:7 ==> 24.024 Absolute error = 2.4000000000e-2, Relative error = 1.0000000000e-3 ##2 #:7 <== 1.0e-2 ##2 #:8 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:3 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:6 <== 39.0 ##3 #:7 ==> 39.039 Absolute error = 3.9000000000e-2, Relative error = 1.0000000000e-3 ##3 #:7 <== 1.0e-3 ##3 #:8 ==> -1.0e-3 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:3 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:6 <== 416.0 ##4 #:7 ==> 416.039 Absolute error = 3.9000000000e-2, Relative error = 9.3750000000e-5 ##4 #:7 <== 1.0e-4 ##4 #:8 ==> -1.0e-4 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns3" does not show the same difference listing of the command 'numdiff -a 0.5:3-6 many_columns1 many_columns2'. If what you want is to obtain the same difference listing of 'numdiff -a 0.5:3-6 many_columns1 many_columns2', then the right command is 'numdiff -X 2:2 -a 0.5:3-6:4-7 many_columns1 many_columns3'. The report printed by this last command is indeed ---------------- ##1 #:2 <== 1 ##1 #:3 ==> 1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:8 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:3 ==> 2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:8 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:3 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:7 <== 1.0e-3 ##3 #:8 ==> -1.0e-3 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:3 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:7 <== 1.0e-4 ##4 #:8 ==> -1.0e-4 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns3" and up to the positions of the fields from 'many_columns3' coincides with the one of 'numdiff -a 0.5:3-6 many_columns1 many_columns2'. The option '-a' can appear more times on the command line. In case of conflicts, the last setting is the one which matters. If you look at the report of the command 'numdiff -a 0.5:3-6 -a 0.08:4 many_columns1 many_columns2' ---------------- ##1 #:2 <== 1 ##1 #:2 ==> 1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:2 ==> 2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:4 <== 9 ##3 #:4 ==> 9.09 Absolute error = 9.0000000000e-2, Relative error = 1.0000000000e-2 ##3 #:7 <== 1.0e-3 ##3 #:7 ==> -1.0e-3 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:4 <== 16 ##4 #:4 ==> 16.16 Absolute error = 1.6000000000e-1, Relative error = 1.0000000000e-2 ##4 #:7 <== 1.0e-4 ##4 #:7 ==> -1.0e-4 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns2" you see that 0.08 and not 0.5 is taken as threshold value for the comparison of the fields in fourth position. Finally, if '-a' is not present on the command line, then the default threshold value of zero applies to all comparisons of numerical fields and any non null absolute difference is considered as significant, unless some other option, for example '-P' or '-N', makes 'numdiff' ignore it. The option '-r' can be used to make two numerical fields be considered equal as long as their relative difference does not exceed a certain threshold, which is specified by the argument that follows the '-r' option. As for the option '-a', the argument of '-r' can have several forms. These forms are the same accepted by '-a' and have the same meanings, but the threshold value applies to the relative difference, not to the absolute one. The relative difference is normally defined in this way. If _n1_ is a value from the file specified as first on the command line and _n2_ is the corresponding value from the second file, then the absolute difference is given by the formula _A=|n1-n2|_. The relative difference _R_ is given by: * _R = 0_ if _n1_ and _n2_ are equal, * _Inf_ (infinity) if _n2_ differs from _n1_ and at least one of them is zero, * _R = A/ min(|n1|, |n2|)_ if _n1_ and _n2_ are both non zero and _n2_ differs from _n1_. _min(|n1|, |n2|)_ denotes the minimum between the absolute value of _n1_ and the absolute value of _n2_. With this definition of relative difference it turns out that _R(n2, n1) = R(n1, n2)_: the relative difference does not change if you only change the ordering of the compared files on the command line. There are cases when this default definition of relative error makes no sense. This can happen for instance when one of the files is a sample file containing a list of expected data, which could have been computed theoretically or come from experiments in a laboratory. In this case it is more natural to define the relative difference as the ratio between the absolute difference and the absolute value of the number coming from the sample file. If you use the option '-F' together with the argument 1 (or 2), then Numdiff always compute the relative difference as the ratio between the absolute difference and the absolute value of the number from the first file (the second file, respectively). More precisely, with '-F 1' the relative difference _R_ is computed according to these rules: * _R = 0_ if _n1_ and _n2_ are equal, * _Inf_ (infinity) if _n2_ differs from _n1_ and _n1_ is zero, * _R = |n1-n2|/ |n1|_ if _n1_ is not zero and _n2_ differs from _n1_. With '-F 2' the rules become: * _R = 0_ if _n1_ and _n2_ are equal, * _Inf_ (infinity) if _n2_ differs from _n1_ and _n2_ is zero, * _R = |n1-n2|/ |n2|_ if _n2_ is not zero and _n2_ differs from _n1_. With the last two sets of rules it is not anymore true that _R(n2, n1) = R(n1, n2)_: the relative difference changes, in the general case, together with the ordering of the files on the command line. As a simple example, suppose that FILE1 and FILE2 contain 1 9.9 0.5 440 and 1.2 8 0.51 400 respectively. Then 'numdiff FILE1 FILE2' displays ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 Absolute error = 1.0000000000e-2, Relative error = 2.0000000000e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 Absolute error = 4.0000000000e+1, Relative error = 1.0000000000e-1 +++ File "file1" differs from file "file2" 'numdiff -F 1 FILE1 FILE2' prints ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 Absolute error = 1.9000000000e+0, Relative error = 1.9191919192e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 Absolute error = 1.0000000000e-2, Relative error = 2.0000000000e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 Absolute error = 4.0000000000e+1, Relative error = 9.0909090909e-2 +++ File "file1" differs from file "file2" the output of 'numdiff -F 2 FILE1 FILE2' is ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 Absolute error = 2.0000000000e-1, Relative error = 1.6666666667e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 Absolute error = 1.0000000000e-2, Relative error = 1.9607843137e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 Absolute error = 4.0000000000e+1, Relative error = 1.0000000000e-1 +++ File "file1" differs from file "file2" 'numdiff -F 1 -r 0.195 FILE1 FILE2' displays ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 +++ File "file1" differs from file "file2" and finally, 'numdiff -F 2 -r 0.195 FILE1 FILE2' displays ---------------- ##1 #:2 <== 9.9 ##1 #:2 ==> 8 Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 +++ File "file1" differs from file "file2" The option '-2' is only meaningful when the user specifies a non-zero tolerance threshold for both absolute and relative difference. Without this option 'numdiff' considers two numerical fields equal as long as at least one between absolute and relative difference does not exceed the corresponding threshold. With the option '-2' 'numdiff' regards two numerical fields as equal only if both absolute and relative difference do not exceed the thresholds of tolerance specified for those fields. For example, if FILE1 contains the unique line 100 and FILE2 the line 100.00012 then the output of the command 'numdiff FILE1 FILE2' will be ---------------- ##1 #:1 <== 100 ==> 100.00012 @ Absolute error = 1.2000000000e-4, Relative error = 1.2000000000e-6 +++ File "FILE1" differs from file "FILE2" The output of the commands 'numdiff -a 1.0e-4 FILE1 FILE2' and 'numdiff -r 1.0e-6 FILE1 FILE2' will be the same as above, but 'numdiff -a 1.0e-4 -r 1.3e-6 FILE1 FILE2' and 'numdiff -a 1.3e-4 -r 1.0e-6 FILE1 FILE2' will print the message +++ Files "FILE1" and "FILE2" are equal since the relative difference is 1.2e-6 < 1.3e-6, the absolute difference is 1.2e-4 < 1.3e-4, and it is sufficient that one of them does not exceed its tolerance threshold. On the other hand, the commands 'numdiff -a 1.0e-4 -r 1.3e-6 -2 FILE1 FILE2' and 'numdiff -a 1.3e-4 -r 1.0e-6 -2 FILE1 FILE2' will both print the message ---------------- ##1 #:1 <== 100 ==> 100.00012 @ Absolute error = 1.2000000000e-4, Relative error = 1.2000000000e-6 +++ File "FILE1" differs from file "FILE2" since the option '-2' makes 'numdiff' regard two values as equal only if both absolute and relative difference do not exceed the respective threshold of tolerance. The option '-P' makes 'numdiff' consider two values equal whenever the second one, i.e. the value coming from the file specified as last on the command line, is less or equal than the first one, which is the value coming from the file specified as first on the command line. If the values to compare are complex numbers, saying that the second one is less or equal than the first one means that both real and imaginary part of the second value are not greater than real and imaginary part of the first value, respectively. Finally, the option '-N' makes 'numdiff' consider two values equal whenever the second one, i.e. the value coming from the file specified as last on the command line, is greater or equal than the first one, which is the value coming from the file specified as first on the command line. If the values to compare are complex numbers, saying that the second one is greater or equal than the first one means that both real and imaginary part of the second value are not less than real and imaginary part of the first value, respectively. The options '-B', '-I', '-l', '-o', '-h', and '-v' do not require further explanations. The options '-l' and '-o' are only supplied for the users of poorly designed operating systems, whose default shell does not allow the redirection of standard error and standard output. The option '-I' has no effect on the outcome of numerical comparisons but affects the action of the filter, *note Filtering::. The option '-s' requires as argument a set of characters, which will be taken as field delimiters. It is better to quote the set of the delimiters, just as in the next examples: numdiff -s ' \t\n,;:.' FILE1 FILE2 numdiff -s ' \t\n\r\f\v"\:;' FILE1 FILE2 numdiff -s `` \t\n''' FILE1 FILE2 If you want to include in the set of delimiters also some special characters, e.g. the *blank*, then you must quote it. I recommend you to always use the single quote character (') to enclose the list of the delimiters, since in this way you will prevent any substitution or handling of characters by the shell. 'numdiff' recognizes and interprets the following sequences of characters within the argument passed to the option '-s': * '\a' alert (bell), * '\b' backspace, * '\f' form feed, * '\n' newline, * '\r' carriage return, * '\s' blank, * '\t' horizontal tab, * '\v' vertical tab, * '\\' backslash, * '\NNN' the eight-bit character whose value is the octal value NNN (one to three digits), * '\xHH' the eight-bit character whose value is the hexadecimal value HH (one or two digits). Thus, by passing the string ' \t\n,;:.' as argument for the option '-s' one tells 'numdiff' to use as field delimiters the characters *blank*, *horizontal tab*, *newline*, *comma*, *semicolon*, *colon*, and *dot*. Passing ' \t\n' as argument to the option '-s' is the same as not using at all the option '-s', since *blank*, *horizontal tab*, and *newline* are the default field delimiters. In the list of field delimiters the character *backslash* ('\') is always treated in a special way. If it forms, combined with the subsequent character(s), one of the escape sequences listed above, then it is considered to be an escape character, and the whole escape sequence is decoded as shown above. Otherwise, the *backslash* is just ignored. Therefore, the delimiters specified by the command line numdiff -s' \t\n\\\"' FILE1 FILE2 are *blank*, *horizontal tab*, *newline*, *backslash* and *double quote*, since '\\' and '\"' are interpreted by 'numdiff' as '\' and '"'. Even if I have recommended to enclose the set of delimiters in single quotes, there are cases in which you will be forced to use the double quote character ('"') to enclose the set of field delimiters, e.g. if the single quote character is used itself as field delimiter, like in one of the precedent examples. However, you must take into account that in this case the shell could make some substitutions on the command line before executing 'numdiff'. For instance, if your shell is GNU bash, then (citing the man page of GNU bash) Enclosing characters in double quotes preserves the literal value of all characters within the quotes, with the exception of '$', '`', and '\'. The characters '$' and '`' retain their special meaning within double quotes. The backslash retains its special meaning only when followed by one of the following characters: '$', '`', '"', '\', or **. A double quote may be quoted within double quotes by preceding it with a backslash ... The special parameters * and @ have special meaning when in double quotes ... Therefore, if the set of delimiters is formed by ' ', '\t', '\n', '\' and '"', and you decide to enclose them in double quotes, the 'numdiff' command line should be numdiff -s'' \t\n\\\\\"'' FILE1 FILE2 and not numdiff -s'' \t\n\\\"'' FILE1 FILE2 In the latter case the shell would indeed replace the string ' \t\n\\\"' by ' \t\n\"' and then 'numdiff' would take ' ', '\t', '\n' and '"' as field delimiters. 'numdiff' requires the presence of the *newline* in the set of characters passed to '-s'. The absence of the *newline* in the set of delimiters causes the issue of a warning message and the termination of the program. If you run Numdiff with the option '-B' ('--binary') on files created under MSDog/MSWindoze, then you should put the *carriage return* in the set of field delimiters. Otherwise, this character would be included in all the fields which stay at the end of a line and this would cause some undesirable effects. For instance, a number put at the end of a line would not be regarded as a numerical field by 'numdiff', since 'numdiff' would consider the final *carriage return* as part of the field, and this one would be then qualified as non-numerical. You can specify different delimiters for the two files to compare by putting the prefix '1:' or '2:' in front of the set of characters passed to '-s'. If the argument of '-s' begins with '1:', the characters after this prefix are used as field delimiters only for the file passed as first on the command line. Analogously, if the prefix is '2:', then the characters after it are used as field delimiters only for the file specified as second on the command line. You can also provide an explicit set of delimiters for just one of the files to compare, in which case 'numdiff' uses the default field delimiters *blank*, *tab* and *newline* for the other file. Therefore, with 'numdiff -s '1:: \n' FILE1 FILE2' the program will take *colon*, *blank* and *newline* as delimiters for FILE1, and *blank*, *tab* and *newline* as delimiters for FILE2. The recommendations about quoting the set of delimiters are valid also in presence of a prefix. Starting from version 5.8 'numdiff' allows to specify whole strings as field delimiters instead of single characters. To this purpose the option '-D' is provided. Assume that file 'register1' and file 'register2' contain --A: +1.0--- --B: -2.0--- --C: +3.0--- --D: -4.0--- --E: +5.0--- --F: -6.0--- and --a: +1.1--- --b: -2.2--- --c: +3.3--- --d: -4.4--- --e: +5.5--- --f: -6.6--- respectively. Assume in addition, you would like that the dashes at the begin and at the end of every line are treated as delimiters and then neglected during the line by line comparison. To obtain this you cannot just specify the character - (minus) as delimiter via the option '-s': if you do it, the negative numbers appearing in the two files will be treated as positive, since the minus sign will be regarded as a delimiter. By means of the option '-D' you can tell 'numdiff' to consider the strings -- and --- as field delimiters, but not the single character -. To see this in practice, look at the output of the command 'numdiff -D ': -- --- \s \n' register1 register2': ---------------- ##1 #:1 <== A ##1 #:1 ==> a @ ##1 #:2 <== +1.0 ##1 #:2 ==> +1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##2 #:1 <== B ##2 #:1 ==> b @ ##2 #:2 <== -2.0 ##2 #:2 ==> -2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##3 #:1 <== C ##3 #:1 ==> c @ ##3 #:2 <== +3.0 ##3 #:2 ==> +3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##4 #:1 <== D ##4 #:1 ==> d @ ##4 #:2 <== -4.0 ##4 #:2 ==> -4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##5 #:1 <== E ##5 #:1 ==> e @ ##5 #:2 <== +5.0 ##5 #:2 ==> +5.5 Absolute error = 5.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##6 #:1 <== F ##6 #:1 ==> f @ ##6 #:2 <== -6.0 ##6 #:2 ==> -6.6 Absolute error = 6.0000000000e-1, Relative error = 1.0000000000e-1 +++ File "register1" differs from file "register2" The argument '-D ': -- --- \s \n'' instructs 'numdiff' to regard every occurrence of a colon (:), of a blank (\s), of a newline (\n), as well as every occurrence of the strings -- and --- as field delimiters. The minus sign in front of the negative numbers is then properly handled. In general the argument to the option '-D' is a blank separated sequence of one or more strings each of which contains no blank. Thus, the general form of the argument to the option '-D' is STRING1 STRING2 ... STRINGN where STRING1, STRING2, and so on are sequences of one or more characters (strings) containing no blank. Mind that at least one of these strings must be '\n'. In addition, if a string contains the newline character, this must be the only one: strings like '#\n', '%%\n', or '\s\n' are not allowed (entering such a string makes the program terminate after issuing a warning message). Since the blank character has a special meaning for the shell, if the argument of '-D' is formed by two or more strings it should be quoted either with a single (''') or with a double quote ('"'). Quoting is also adviced if one of the strings passed to '-D' contains a character (or a sequence of characters) having a special meaning for the shell. For the usage of single and double quoting to delimit the argument of '-D' the same warnings and recommendations apply as for the argument of '-s'. If you want to set as delimiter a string which contains one or more blanks, then you have to make use of the escape sequence '\s', like in the example above: within the argument of '-D' the blank character is always interpreted as a separator of adjacent delimiters. More generally, when writing the argument of '-D' the same escape sequences are allowed as for the argument of '-s'. This turns out to be particularly useful whenever a multibyte character is used as delimiter in (one of) the files to compare. As example consider the comparison between 'ledger1': In Out Jan 1200.00Euro 1000.00Euro Feb 800.40Euro 650.00Euro Mar 1620.50Euro 1500.00Euro Apr 760.00Euro 900.00Euro Total 4380.90Euro 4050.00Euro Difference: +330.90Euro and 'ledger2': In Out Jan 1100.00Euro 1000.00Euro Feb 800.40Euro 750.00Euro Mar 1620.50Euro 1700.00Euro Apr 750.00Euro 900.00Euro Total 4270.90Euro 4350.00Euro Difference: -79.10Euro Since the Euro symbol is attached to all values, 'numdiff' cannot compare them in the proper way if it is run with the default field delimiters, as the output of the command 'numdiff ledger1 ledger2' shows: ---------------- ##3 #:2 <== 1200.00Euro ##3 #:2 ==> 1100.00Euro @ ---------------- ##4 #:3 <== 650.00Euro ##4 #:3 ==> 750.00Euro @ ---------------- ##5 #:3 <== 1500.00Euro ##5 #:3 ==> 1700.00Euro @ ---------------- ##6 #:2 <== 760.00Euro ##6 #:2 ==> 750.00Euro @ ---------------- ##8 #:2 <== 4380.90Euro ##8 #:2 ==> 4270.90Euro @ ##8 #:3 <== 4050.00Euro ##8 #:3 ==> 4350.00Euro @ ---------------- ##10 #:2 <== +330.90Euro ##10 #:2 ==> -79.10Euro @ +++ File "ledger1" differs from file "ledger2" The trick to perform the comparison in the proper way consists in specifying the Euro symbol as field delimiter, in addition to blank, horizontal tabulation and newline. If 'ledger1' and 'ledger2' are encoded in UTF-8, this can be done by using the option '-D' with the argument '\xE2\x82\xAC \s \t \n', since the hexadecimal representation of Euro in UTF8 is given by the byte sequence 0xE2 0x82 0xAC. On my PC the output of the command 'numdiff -D '\xE2\x82\xAC \s \t \n' ledger1 ledger2' shows that with such a choice of the delimiters 'numdiff' performs indeed a numerical comparison of the values contained in the two files: ---------------- ##3 #:2 <== 1200.00 ##3 #:2 ==> 1100.00 Absolute error = 1.0000000000e+2, Relative error = 9.0909090909e-2 ---------------- ##4 #:3 <== 650.00 ##4 #:3 ==> 750.00 Absolute error = 1.0000000000e+2, Relative error = 1.5384615385e-1 ---------------- ##5 #:3 <== 1500.00 ##5 #:3 ==> 1700.00 Absolute error = 2.0000000000e+2, Relative error = 1.3333333333e-1 ---------------- ##6 #:2 <== 760.00 ##6 #:2 ==> 750.00 Absolute error = 1.0000000000e+1, Relative error = 1.3333333333e-2 ---------------- ##8 #:2 <== 4380.90 ##8 #:2 ==> 4270.90 Absolute error = 1.1000000000e+2, Relative error = 2.5755695521e-2 ##8 #:3 <== 4050.00 ##8 #:3 ==> 4350.00 Absolute error = 3.0000000000e+2, Relative error = 7.4074074074e-2 ---------------- ##10 #:2 <== +330.90 ##10 #:2 ==> -79.10 Absolute error = 4.1000000000e+2, Relative error = 5.1833122630e+0 +++ File "ledger1" differs from file "ledger2" If 'ledger1' and 'ledger2' had been saved using a multi-byte encoding different from UTF-8, then the sequence of bytes which corresponds to Euro in this other encoding should have been passed to '-D'. As for '-s', with '-D' you can specify different delimiters for the two files to compare by means of the prefixes '1:' and '2:', like in 'numdiff -D '1:\t \n' -D '2: -- \s \n' first_file second_file'. The recommendations about quoting the set of delimiters are valid also in presence of a prefix. Mind that, if you provide an explicit set of delimiters for just one of the files to compare, 'numdiff' uses the default field delimiters *blank*, *tab* and *newline* for the other file. If you run Numdiff with the option '-B' ('--binary') on files created under MSDog/MSWindoze, you should always include the character '\r' in the set of field delimiters. The option '-s' and '-D' can appear more than once on the command line. In case of conflicts, 'numdiff' assumes as set of delimiters for a given file the one specified last on the command line. By means of the option '-#' the user can set the number of digits in the significands used in multiple precision arithmetic. The default value is 35, the largest admissible value is 180. If 'numdiff' has been linked against the GNU Multiple Precision Arithmetic Library (also called GNU MP), then the precision it uses is typically higher than the specified one. On my machine the actual value of the precision is 20 if the user requests a value between 0 and 20, 30 if the user specifies a precision between 21 and 30, 40 for a user-specified value between 31 and 40, and so on. Anyway, the actual precision is never less than the one requested by the user. Take into account that an higher precision makes the execution of 'numdiff' slower. This is particularly true if 'numdiff' is not using the computational routines from the GNU MP library and the files to compare contain a lot of numerical fields. In addition, mind that 'numdiff' truncates the value of a numerical field if it has too much digits with respect to the current precision. To be precise, denoted by P the current value of the precision, the following rules apply. * If 'numdiff' has been built with its own internal support for multiple precision arithmetic, then * if a number is written in ordinary decimal notation, 'numdiff' will consider, in addition to all digits of the integer part, only the first P digits of the fractional part; * if a value is written in scientific notation, then 'numdiff' will only consider the first P digits of the fractional part of the mantissa. * If 'numdiff' uses the routines from the GNU MP library to perform its computations, the value of a numerical field is first translated into scientific notation and then only the first P digits of the fractional part of the mantissa are considered. You can find out whether your local version of 'numdiff' is relying on GNU MP or not by executing the command 'numdiff -v'. If 'numdiff' uses GNU MP, then this command will display the following message or similar (possibly translated into your mother language) among other information: The software has been linked against the GNU Multiple Precision Arithmetic Library, version number 4.2.4. If 'numdiff' does not rely on GNU MP, then the displayed message will be (up to translation into your mother language) The software has been built with its own internal support for multiple precision arithmetic. By means of the option '-c' the user can qualify a string as a symbol or name for a currency. The string passed as argument to this option is ignored whenever it appears immediately before the first digit of a number. In particular, the presence of this string does not prevent a field from being considered of numeric type. By prefixing the argument of '-c' with '1:' or '2:' it is possible to set the currency name/symbol only for one of the compared files, or to specify different currency names for the two files. As example we consider the files 'money1': Profits Expenses +$430.10 -$300.50 +$750.20 -$550.02 +$876.24 -$720.00 Totals $2056.54 -$1570.52 and 'money2': Profits Expenses USD430.10 -USD300.50 USD750.20 -USD550.02 USD876.24 -USD720.15 Totals 2056.54 -1570.67 To properly compare them, we have to tell 'numdiff' that '$' and 'USD' are the currency symbols for 'money1' and 'money2', respectively. This can be achieved by '-c 1:$' and '-c 2:USD'. The output of the command 'numdiff -c 1:$ -c 2:USD money1 money2' is ---------------- ##5 #:2 <== -$720.00 ##5 #:2 ==> -USD720.15 Absolute error = 1.5000000000e-1, Relative error = 2.0833333333e-4 ---------------- ##7 #:3 <== -$1570.52 ##7 #:3 ==> -1570.67 Absolute error = 1.5000000000e-1, Relative error = 9.5509767466e-5 +++ File "money1" differs from file "money2" as it is reasonable to expect. The argument of '-c' may also be a multi-byte string, in particular a multi-byte string encoded in UTF-8. If your locale uses UTF-8 as encoding, you can write the argument directly in this form. For instance, you can write '-c Euro' to specify as currency name the Euro symbol. If your locale does not use UTF-8 as encoding, or UTF-8 is not supported by your terminal, you may still write an UTF-8 encoded string as a multi-byte string by specifying each single byte of every (multi-byte) character. To this purpose you can use the same octal and hexadecimal escape sequences recognized by the options '-s' and '-D', but then the argument of '-c' has to be quoted to avoid the interpretation of the hexadecimal escape sequences by the shell. For example, if the files to compare are encoded in UTF-8, you can set Euro as currency name by adding '-c '\xE2\x82\xAC'' to the command line of 'numdiff', since the hexadecimal representation of Euro in UTF-8 is given by the sequence of bytes 0xE2 0x82 0xAC. To see this in practice, if 'euro1' contains the text Profits Expenses +Euro430.10 -Euro300.50 +Euro750.20 -Euro550.02 +Euro876.24 -Euro720.00 and 'euro2' the text Profits Expenses +Euro430.10 -Euro300.00 +Euro750.20 -Euro550.02 +Euro876.00 -Euro720.00 then the report of 'numdiff -c '\xE2\x82\xAC' euro1 euro2' is ---------------- ##3 #:2 <== -Euro300.50 ##3 #:2 ==> -Euro300.00 Absolute error = 5.0000000000e-1, Relative error = 1.6666666667e-3 ---------------- ##5 #:1 <== +Euro876.24 ##5 #:1 ==> +Euro876.00 Absolute error = 2.4000000000e-1, Relative error = 2.7397260274e-4 +++ File "euro1" differs from file "euro2" Please consider that '-c' is only provided to let 'numdiff' regard a field as numeric also in presence of a currency name immediately before its first digit: 'numdiff' does not know anything about currencies and can not perform any kind of conversion between them. In addition, mind that the number after the currency name can be written in any format, not only in financial notation. 'numdiff' can even cope with the currency name when it appears in a complex number. For example, with '-c EUR' 'numdiff' considers +EUR12-EUR0.24i and +12-0.24i as equal. The options '-d', '-t', '-g', '-p', '-n', '-e' and '-i' can be used to instruct 'numdiff' about the numeric formats used in the files which it is going to compare. Since the two files to compare do not have to adopt the same numeric format, 'numdiff' allows to specify different numeric formats for them. Each of the options '-d', '-t', '-g', '-p', '-n', '-e', and '-i' can have as argument one or two (single-byte) characters, in particular one or two digits if the option is '-g'. In the first case the argument refers to both files to compare, in the second case the first character is for the file specified first on the command line, the second character for the file specified last. For instance, the option '-d' can be used to tell 'numdiff' which character(s) is(are) used to indicate the decimal point in the two files to compare. If you give the command 'numdiff -d_ FILE1 FILE2', then 'numdiff' will understand that both in FILE1 and in FILE2 the character *underscore* ('_') is used in place of the default one ('.') to indicate the position of the decimal point in the numerical values. But if the command is 'numdiff -d_: FILE1 FILE2', then 'numdiff' will understand that the decimal point is indicated by the character *underscore* in FILE1, and by *colon* (':') in FILE2. If you omit to use one of the options '-d', '-t', '-g', '-p', '-n', '-e', and '-i', then the corresponding attribute will take its default value, *note Default Numeric Format::. You should be careful whenever you use one or more of these options. First, not all characters can be passed to them as arguments. The arguments of the option '-g' must be digits, the arguments of the options '-d' and '-t' must be punctuation marks (punctuation marks are all the characters of the ASCII set for which the standard C function 'ispunct' returns a non zero value), those ones of the options '-p', '-n', '-e' and '-i' must be graphical characters but digits (graphical characters are all the characters of the ASCII set for which the standard C function 'isgraph' returns a non zero value). It is not possible to set the decimal point, the thousands separator, the positive sign, the negative sign, the prefix for decimal exponent or the symbol of the imaginary unit in such a way that, for a same file, two or more of these characters come out to be equal. This rule also applies if you miss/omit to explicitly select a symbol through the appropriate option. For instance, the command 'numdiff -d,. FILE1 FILE2' will make 'numdiff' abnormally terminate after printing the error message: The numeric format specified for the first file is illegal, the following symbols should be all different while two or more of them are actually equal: Decimal point = `,' Thousands separator = `,' Leading positive sign = `+' Leading negative sign = `-' Prefix for decimal exponent = `e' Symbol used to denote the imaginary unit = `i' With the option '-d' we have told 'numdiff' that in the first file the decimal point is indicated by the character *comma*, but at the same time we have not modified the character in use to separate the groups of thousands, which has remained the default one, i.e. *comma*, for both files to compare. In this way we have implicitly told that in FILE1 the character *comma* represents both decimal point and thousands separator. Since this is not reasonable, 'numdiff' refuses to work. To avoid this problem it would be sufficient to set explicitly the thousands separator by means of the option '-t': 'numdiff -d,. -t., FILE1 FILE2'. Of course, we assume here that the decimal point and the thousands separator are represented in FILE1 by *comma* and *dot* respectively, in FILE2 by *dot* and *comma*. I strongly suggest you, whenever you write a file, to avoid using the same symbol for two different things (like would be using *comma* for both decimal point and thousands separator), it is nonsense. At last, it is possible (but silly) to specify as argument for the options '-d', '-t', '-g', '-p', '-n', '-e', or '-i' one of the characters used as delimiters in the files to compare. 'numdiff' does not complain, but you have to consider that the program first uses the set of field delimiters to split the files into fields and only afterwards, when it has to distinguish between numerical and non-numerical fields, it takes into account the numeric formats specified for the two files. To prevent conflicts, you should then avoid to specify as argument for the options '-d', '-t', '-g', '-p', '-n', '-e', or '-i' a character which is also used as field delimiter. As a general rule, in writing a file you should avoid using the same symbol to mean two different things. What we have said also explains why the argument of the option '-c' should never contain field delimiters. The option '-X' can be used to restrict the comparison between files to a certain group of fields. This option requires as argument a range of positive integer values or eventually just one positive integer number. The argument indicates the position(s) of the fields that 'numdiff' has to ignore. Remember that the fields of a line are numerated starting from the left hand of the line and proceeding towards the right hand. The argument passed to '-X' can start with a prefix, which must be either '1:' or '2:'. '1:' refers to the file passed as first on the command line, '2:' to the file specified as second. With the prefix '1:' only the fields of the first file corresponding to the specified position(s) are ignored. Similarly, you have to use the prefix '2:' if you want to ignore only fields from the second file. The option '-X' can appear more times on the command line, in which case 'numdiff' will ignore all fields located in the positions so specified. Some examples can clarify the use of ranges and prefixes. If the file 'List1' contains the data * a 1 1 1 1 * b 2 2 2 2 * c 3 3 3 3 * d 4 4 4 4 * e 5 5 5 5 and 'List2' the data 1 1.1 1.01 A 1.001 1.0001 2 2.2 2.02 B 2.002 2.0002 3 3.3 3.03 C 3.003 3.0003 4 4.4 4.04 D 4.004 4.0004 5 5.5 5.05 E 5.005 5.0005 then the output of 'numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2' is ---------------- ##1 #:4 <== 1 ##1 #:2 ==> 1.1 @ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:5 <== 1 ##1 #:3 ==> 1.01 @ Absolute error = 1.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##2 #:4 <== 2 ##2 #:2 ==> 2.2 @ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:5 <== 2 ##2 #:3 ==> 2.02 @ Absolute error = 2.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##3 #:4 <== 3 ##3 #:2 ==> 3.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:5 <== 3 ##3 #:3 ==> 3.03 @ Absolute error = 3.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##4 #:4 <== 4 ##4 #:2 ==> 4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:5 <== 4 ##4 #:3 ==> 4.04 @ Absolute error = 4.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##5 #:4 <== 5 ##5 #:2 ==> 5.5 @ Absolute error = 5.0000000000e-1, Relative error = 1.0000000000e-1 ##5 #:5 <== 5 ##5 #:3 ==> 5.05 @ Absolute error = 5.0000000000e-2, Relative error = 1.0000000000e-2 +++ File "List1" differs from file "List2" Numdiff cuts off from 'List1' the fields in the positions 1, 2 and 6 and from 'List2' the fields in the positions 4, 5 and 6. In this way it compares the third, fourth and fifth field of every line of 'List1' with the first, second and third field respectively of the corresponding line of 'List2'. An equivalent form of the command 'numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2' is given by 'numdiff -X 1:1-2 -X 2:4-5 -X 6 List1 List2' : since the sixth field is cut off from both files, we can refer to it without a prefix. As you can see, you can specify a range of fields by using the notation 'M-N', where M and N are the field numbers of the first and of the last field in the range. It is even possible to use range expressions like 'M-' or '-N'. The first expression corresponds to all fields starting from the Mth one (inclusive) till to the end of line, the second selects all fields from the first one till to the Nth one (inclusive). Therefore the command 'numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2' is equivalent to 'numdiff -X 1:-2 -X 2:4 -X 1:6 -X 2:5- List1 List2' and to 'numdiff -X 1:-2 -X 1:6 -X 2:4- List1 List2'. Mind that, while writing a specification for the option '-X', the largest field number you can use is 32768. If you employ the option '-X' the exit status of 'numdiff' reflects the outcome of the restricted comparison. For instance, the exit status of 'numdiff -X 8- FILE1 FILE2' is 1 only if 'numdiff' has found a difference in the first seven fields of FILE1 and FILE2. If the two files differ only in the fields after the seventh one, then 'numdiff' ends with a zero exit status. Going back to the example with 'List1' and 'List2', the output of 'numdiff -X 1:1-2 -X 1:4- -X 2:2- List1 List2' is +++ Files "List1" and "List2" are equal since every field of 'List1' at position 3 is equal to the first field in the corresponding line of 'List2'. The exit code returned by the program to the shell is in this case zero. The options '-z', '-Z', '-m', '-H', '-f', and '-T' influence the action of the filter and their use is then described later, *note Filtering::. Care that '-z' and '-Z' need both an argument in the same form required by '-X'. Since version 5 Numdiff accepts also long options to conform to the GNU standards. For example, now it is possible to use '--separators='\n\t %'' or '--separators '\n\t %'' instead of using '-s '\n\t %''. The long options, which start all with two dashes, are listed at the beginning of this chapter, each one near to the corresponding short option. The argument of a long option may or may not be preceded by the = sign. The only exceptions are the options '--test-filter' and '--overview', for which the presence of the = before the argument is mandatory. Thus, '--test-filter=60' is correct while '--test-filter 60' is not accepted. ---------- Footnotes ---------- (1) By major numerical differences and major errors I mean those ones listed in the output of 'numdiff' if none of the options '-U', '-f', '-O', and '-q' is used. 6 Selecting lines and fields for the comparison *********************************************** Together with the version 5.x of Numdiff is shipped the program 'ndselect'. Originally, I decided to create this utility in order to deal with a situation that comes out often in Numerical Analysis. Here I present a very simple example of such a situation. Let us suppose that file 'list1' contains the values of the square root, rounded to the 20th decimal digit, for all integer numbers between 12 and 24: 12 3.46410161513775458705 13 3.60555127546398929312 14 3.74165738677394138558 15 3.87298334620741688518 16 4 17 4.12310562561766054982 18 4.24264068711928514641 19 4.35889894354067355224 20 4.47213595499957939282 21 4.58257569495584000659 22 4.69041575982342955457 23 4.7958315233127195416 24 4.89897948556635619639 File LIST2 contains _suitable_ approximations of the square root only for the numbers between 12 and 21 which are multiple of 3: 12 3.46410162002945508100 15 3.87298387096774193548 18 4.24264705882352941176 21 4.58260869565217391304 These approximations could have been obtained by using the famous Heron's algorithm: given an approximation 'a' for the square root of a number 'x', a better approximation is computed by using the formula 'a := 0.5 * (x/a + a)'. What we want now is to understand by means of 'numdiff' how good the approximations contained in file LIST2 are. Unfortunately, we cannot execute directly the command 'numdiff list1 list2', since in this way we would compare the approximations provided for the square roots of 15, 18, and 21 with the square roots of 13, 14, and 15, respectively. To make the comparison in the right way, one could open 'list1' in a text editor and remove from this file all lines but the ones related to the numbers 12, 15, 18, and 21. This approach is practicable since we have to remove only a few lines: one can easily figure out how boring and inefficient would be to manually remove hundreds or thousands of lines from a file. An expert GNU user would suggest that it is possible to automate this removal by using the well known utilities 'head' and 'sed', in this particular case 'head -n 10 list1 | sed -n -e '1~3 p' > List1'. A quick explanation for the ones who do not know how to use 'head' and 'sed': the previous command extracts from 'list1' the first 10 lines, namely the lines containing the square roots of the numbers from 12 to 21, then picks every third line starting from the first one to select only the lines related to 12, 15, 18, and 21. Finally, these lines are printed to the file 'List1', which then looks like: 12 3.46410161513775458705 15 3.87298334620741688518 18 4.24264068711928514641 21 4.58257569495584000659 Once obtained 'List1', we can perform the comparison between the values we are interested in by means of 'numdiff List1 list2' . Unfortunately, this trick only works if you have installed the GNU version of 'sed' which, as far as I know, is the only one providing the extension FIRST~STEP to specify line addresses. This is why I decided to implement 'ndselect', which allows to obtain the same result as above with the simpler command 'ndselect -b 1 -e 10 -s 3 list1 > List1'. The meaning of the arguments passed to the options '-b', '-e', and '-s' is the following: we tell 'ndselect' to print every third line of file 'list1' (the option '-s' specifies the step) starting from the first one (the option '-b' specifies the beginning) and ending within the tenth one possibly inclusive (the option '-e' specifies the end). Because of the presence of the redirection operator '>', the previous command sends to the file 'List1' what 'ndselect' would print to the screen (standard output). Since version 5.6 'ndselect' can also be used to select particular fields of a file. Instead of printing all fields of every line, you may want to print indeed only the fields at particular positions. To do this you can employ the option '-F' to indicate the position of the first field to print, the option '-L' to indicate the position of the last field that can be printed, the option '-I' to set the increment when selecting the fields. In addition, the option '-S' can be used to specify a set of field delimiters different from the default one (which consists of *blank*, *tab* and *newline*). As for 'numdiff', the field delimiters are used to split the input lines into fields. The option '-S' of 'ndselect' recognizes and accepts the same escape sequences of 'numdiff' options '-s', '-D', and '-c'. As example consider the selection of the even fields between the second and the sixth one inclusive from the file 'many_many_columns', whose contents are shown here: A | I | 1.1 | 1.08 | 1.01 | 0.1 | 11.011 | -1.0e-1 B | II | 2.2 | 2.16 | 4.04 | 0.4 | 24.024 | -1.0e-2 C | III | 3.3 | 3.24 | 9.09 | 0.9 | 39.039 | -1.0e-3 D | IV | 4.4 | 4.32 | 16.16 | 1.6 | 416.039 | -1.0e-4 E | V | 5.5 | 5.40 | 25.25 | 2.5 | 525.416 | -1.0e-5 F | # | # | # | # | # | # | # This selection can be accomplished by means of the command 'ndselect -S '| \t\n' -F 2 -L 6 -I 2 many_many_columns', whose output shows only the selected fields: I | 1.08 | 0.1 II | 2.16 | 0.4 III | 3.24 | 0.9 IV | 4.32 | 1.6 V | 5.40 | 2.5 # | # | # Of course, you can also select particular fields of particular lines, as shown by the output of the command 'ndselect -S '| \t\n' -b 1 -e 5 -s 3 -F 2 -L 6 -I 2 many_many_columns': I | 1.08 | 0.1 IV | 4.32 | 1.6 By default, 'ndselect' reuses the delimiters found in the input lines while writing the selected fields to the standard output. You can specify a custom separator by means of the option '-O'. This one recognizes and accepts the same escape sequences of 'numdiff' options '-s', '-D', and '-c'. For example, 'ndselect -S '| \t\n' -b 1 -e 5 -s 3 -F 2 -L 6 -I 2 -O '\t\t' many_many_columns' puts two horizontal tabulations after every printed field: I 1.08 0.1 IV 4.32 1.6 Even if the implementation of a filter in 'numdiff' and the addition of the option '-X' have made 'ndselect' much less useful than in the past, this tool can still be used to handle some special cases. In addition, it can be used as a filter for other programs than 'numdiff'. The complete synopsis of 'ndselect' can be found in the next chapter. 7 Invoking ndselect ******************* *SYNOPSIS* ndselect -h|--help|-v|--version or ndselect [-b N][-e N][-s N][-F N][-L N][-I N][-S IFS][-D DELIMS] [-O OSEP][-x][-l PATH][-o PATH][FILE] where FILE is the name of the file to read from. In the first case 'ndselect' prints a short help or/and version number, Copyright, License notice, and NO-Warranty disclaimer. In the second case 'ndselect' prints to the standard output a subset of lines and fields from FILE. The complete path of FILE should be given, a directory name is not accepted. If no input file is specified, the program reads from the standard input. *OPTIONS* '-b, --beginning, --start=N' Set to N the number of the first line to print (The default behavior is to start with line number 1) '-e, --end=N' Set to N the number of the last line that can be printed (The default behavior is to arrive till to the end of the file) '-s, --step=N' Set to N the increment to use when selecting the lines to print (The default value for the increment is 1) '-F, --first-field=N' Set to N the number of the first field to print (The default behavior is to start with field number 1) '-L, --last-field=N' Set to N the number of the last field that can be printed (The default behavior is to arrive till to the end of every line) '-I, --increment=N' Set to N the increment to use when selecting the fields to print (The default value for the increment is 1) '-S, --separators=IFS' Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline) '-D, --delimiters=DELIMS' Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline) '-O, --output-separator=OSEP' Specify the string to use as separator while writing the selected fields to the standard output (The default behavior consists in reusing the delimiters found in the input lines) '-x, --omit-empty-lines' Do not print empty lines '-l, --warnings-to=PATH' Redirect warning and error messages from stderr to the indicated file '-o, --output=PATH' Redirect output from stdout to the indicated file '-h, --help' Show this help message '-v, --version' Show version number, Copyright, Distribution Terms and NO-Warranty Passing 0 as argument to the option '-L' or to '-e' is equivalent to omit this option and leave enabled the default behavior (which consists in scanning till to the end of the line and of the file, respectively). *DIAGNOSTICS* The exit status is 0 in case of normal termination, -1 (255) in case of error. As 'numdiff' does, since version 5 also 'ndselect' accepts long options. Thus, instead of 'ndselect -b 1 -e 10 -s 3 list1 > List1' you can write 'ndselect --start=1 --end=10 --step=3 list1 > List1'. The usage of the option '-D' is the same as for 'numdiff'. The option '-S' corresponds to the option '-s' of 'numdiff'. 8 Using the filter of numdiff ***************************** Since version 5 you can activate a filter when launching 'numdiff' to make the program appropriately compare the given files even if they do not have the same structure. Recalling the example of chapter 6, if you run the command 'numdiff -z 2- -V list1 list2' you obtain the following result: ---------------- ##1 <== 12 3.46410161513775458705 ##1 ==> 12 3.46410162002945508100 ##1 #:2 <== 3.46410161513775458705 ##1 #:2 ==> 3.46410162002945508100 Absolute error = 4.8917004940e-9, Relative error = 1.4121122985e-9 ---------------- ##2 <== 13 3.60555127546398929312 ==> ---------------- ##3 <== 14 3.74165738677394138558 ==> ---------------- ##4 <== 15 3.87298334620741688518 ##2 ==> 15 3.87298387096774193548 ##4 #:2 <== 3.87298334620741688518 ##2 #:2 ==> 3.87298387096774193548 Absolute error = 5.2476032505e-7, Relative error = 1.3549253331e-7 ---------------- ##5 <== 16 4 ==> ---------------- ##6 <== 17 4.12310562561766054982 ==> ---------------- ##7 <== 18 4.24264068711928514641 ##3 ==> 18 4.24264705882352941176 ##7 #:2 <== 4.24264068711928514641 ##3 #:2 ==> 4.24264705882352941176 Absolute error = 6.3717042443e-6, Relative error = 1.5018250929e-6 ---------------- ##8 <== 19 4.35889894354067355224 ==> ---------------- ##9 <== 20 4.47213595499957939282 ==> ---------------- ##10 <== 21 4.58257569495584000659 ##4 ==> 21 4.58260869565217391304 ##10 #:2 <== 4.58257569495584000659 ##4 #:2 ==> 4.58260869565217391304 Absolute error = 3.3000696334e-5, Relative error = 7.2013423303e-6 ---------------- ##11 <== 22 4.69041575982342955457 ==> ---------------- ##12 <== 23 4.7958315233127195416 ==> ---------------- ##13 <== 24 4.89897948556635619639 ==> +++ File "list1" differs from file "list2" Numdiff has recognized that the lines of 'list1' with the square roots for the numbers 13, 14, 16, 17, 19, 20, 22, 23, and 24 have been deleted from 'list2'. The numerical comparison has been done by coupling each line of 'list2' with the line of 'list1' which displays the square root for the same integer value. The output obtained running the filter of Numdiff via 'numdiff -f -z 2- list1 list2' confirms this: 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 < 14 3.74165738677394138558 < 15 3.87298334620741688518 15 3.87298387096774193548 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 18 4.24264705882352941176 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 21 4.58260869565217391304 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" If you compare the command 'numdiff -z 2- -V list1 list2' with the one used for the files 'bill1' and 'bill2', *note command::, you surely notice that the filter has been invoked in different ways, first with '-z @' and then with '-z 2-'. The synchronization procedure used by the filter is based on blurring and byte-by-byte comparison. The options '-z' and '-Z' are used to select which fields from which file have to be blurred. They take both an argument in the same form requested by '-X', *note Use of the option -X::, but accept additionally the special value '@' as abbreviation for the range of fields '1-'. Thus, the specifications '1:@', '2:@' and '@' are used to mean all fields of the first file, of the second one or of both, respectively. Employing '-z' and '-Z' in the right way is extremely important to let the filter work as desired. For instance, 'numdiff -f -z @ list1 list2' matches the lines of 'list1' and 'list2' in the same wrong way 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 15 3.87298387096774193548 14 3.74165738677394138558 18 4.24264705882352941176 15 3.87298334620741688518 21 4.58260869565217391304 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 < 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 < 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" as Numdiff would do without employing the filter. It is essential then to understand what blurring a field means and how the filter uses blurring to match the lines of the files to compare. After reading the files the filter removes from each of them (from their images in the memory, actually) all the fields selected by the option '-X', then it replaces each of the fields that have to be blurred by a special character. This special character is the same for both files and it is so chosen that it cannot appear in the text. Blurring a field means to replace it by this sort of place card. After doing this, the filter converts all remaining numerical fields to a standard format and then compares the files byte by byte neglecting the field delimiters. This comparison is just used to establish which lines of the first file are not present in the second, which lines of the second file are missing in the first one, and how to match the remaining lines to create a one-to-one correspondence. Only at this point 'numdiff' inspects each couple of corresponding lines, splits the two lines into the constituent fields, and neglecting those ones eventually specified through the option '-X' compares corresponding fields as it is supposed to do, performing a numerical comparison whenever the fields are both legal numerical values. Blurring the right fields is essential to appropriately match the lines from the two files before doing any numerical comparison. Without blurring, the numerical fields could prevent the filter of 'numdiff' from an appropriate matching of the lines by creating confusion with their (maybe small) numeric differences. Blurring can be of two types, conditional or unconditional. The blurring is conditional if it has to be performed only for fields which turn out to be legal numerical values. The arguments of the option '-z' indicate which fields of which file have to be blurred *under the condition that they are recognized as numeric fields*. Non-numeric fields are left by '-z' untouched (no blurring occurs for them). Then '-z 1:5-7' makes the filter blur the 5th, 6th and 7th field of each line of the first file whenever they are recognized as numeric. By means of the option '-Z' you can specify which fields have to be unconditionally blurred, i.e. independently of their type, numeric or not. For example, '-Z 2:3-4' activates the blurring of the 3th and 4th field of each line of the second file. Going back to the comparison of the files 'list1' and 'list2', the option '-z 2-' of the command 'numdiff -z 2- -V list1 list2' makes the filter transform the (memory copies of the) two files as 12 * 13 * 14 * 15 * 16 * 17 * 18 * 19 * 20 * 21 * 22 * 23 * 24 * and 12 * 15 * 18 * 21 * respectively. Here * denotes the special symbol used by the filter in the blurring procedure, even if this symbol is not actually a bullet. Since in this example space, tab and newline are used as field delimiters, the byte-by-byte comparison between the transformed files produces the same result displayed by the command 'sdiff -W' when applied to them: 12 * 12 * 13 * < 14 * < 15 * 15 * 16 * < 17 * < 18 * 18 * 19 * < 20 * < 21 * 21 * 22 * < 23 * < 24 * < If you put the blurred fields back you obtain exactly the output of 'numdiff -f -z 2- list1 list2', i.e. the outcome of the filtering: 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 < 14 3.74165738677394138558 < 15 3.87298334620741688518 15 3.87298387096774193548 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 18 4.24264705882352941176 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 21 4.58260869565217391304 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" Since the second field is a numerical value in all lines of 'list1' and 'list2', using the option '-Z' instead of '-z' makes no difference in this case. The output of 'numdiff -f -Z 2- list1 list2' is then the same of 'numdiff -f -z 2- list1 list2'. After this explanation you should also understand why 'numdiff -f -z @ list1 list2' gives a wrong result. Since also the first field is always a numerical value, the option '-z @' makes the filter transform the two given files as * * * * * * * * * * * * * * * * * * * * * * * * * * and * * * * * * * * respectively, making then impossible to match the lines in a reasonable way. We consider now a typical situation in which it is better to use '-Z' in place of '-z'. If file 'Table1' contains -6 2.449490 -5 2.236068 -4 2.000000 -3 1.732051 -2 1.414214 -1 1.000000 0 0 - - - - - - - - - 1 1.000000 2 1.414214 3 1.732051 4 2.000000 - - - - - - - - - 5 2.236068 6 2.449490 7 2.645751 - - - - - - - - - 8 2.828427 9 3.000000 10 3.162278 11 3.316625 12 3.464102 - - - - - - - - - - - - - - - - - - 13 3.605551 14 3.741657 and 'Table2' contains -6 Not_defined -4 Not_defined -2 Not_defined 0 0.000000 2 1.414216 4 2.000000 6 2.449494 8 2.828469 10 3.162278 12 3.464102 14 3.741658 ********************END then the output of 'numdiff -z 1:2 -Z 2:2 -f Table1 Table2' is -6 2.449490 -6 Not_defined -5 2.236068 < -4 2.000000 -4 Not_defined -3 1.732051 < -2 1.414214 -2 Not_defined -1 1.000000 < 0 0 0 0.000000 - - - - - - - - - < 1 1.000000 < 2 1.414214 2 1.414216 3 1.732051 < 4 2.000000 4 2.000000 - - - - - - - - - < 5 2.236068 < 6 2.449490 6 2.449494 7 2.645751 < - - - - - - - - - < 8 2.828427 8 2.828469 9 3.000000 < 10 3.162278 10 3.162278 11 3.316625 < 12 3.464102 12 3.464102 - - - - - - - - - < - - - - - - - - - < 13 3.605551 < 14 3.741657 14 3.741658 > ********************END +++ File "Table1" differs from file "Table2" which is exactly what is expected. On the other hand the command 'numdiff -z 2 -f Table1 Table2' displays -6 2.449490 | -6 Not_defined -5 2.236068 | -4 Not_defined -4 2.000000 | -2 Not_defined -3 1.732051 < -2 1.414214 < -1 1.000000 < 0 0 0 0.000000 - - - - - - - - - < 1 1.000000 < 2 1.414214 2 1.414216 3 1.732051 < 4 2.000000 4 2.000000 - - - - - - - - - < 5 2.236068 < 6 2.449490 6 2.449494 7 2.645751 < - - - - - - - - - < 8 2.828427 8 2.828469 9 3.000000 < 10 3.162278 10 3.162278 11 3.316625 < 12 3.464102 12 3.464102 - - - - - - - - - < - - - - - - - - - < 13 3.605551 < 14 3.741657 14 3.741658 > ********************END +++ File "Table1" differs from file "Table2" which is partially wrong. Notice that in 'Table1' you find (truncated to the sixth decimal digit) the square roots of the absolute values of the integer numbers between -6 and 20, plus some randomly added lines. The file 'Table2' contains approximations (obtained by Newton's method) of the square roots of the even numbers between -6 and 20. Since the (real) square root is not defined for negative numbers, the values corresponding to -6, -4 and -2 are replaced by Not_defined. Since Not_defined is not a numeric value, during the execution of the last command the filter transforms 'Table1' in this way -6 * -5 * -4 * -3 * -2 * -1 * 0 * - - - - - - - - - 1 * 2 * 3 * 4 * - - - - - - - - - 5 * 6 * 7 * - - - - - - - - - 8 * 9 * 10 * 11 * 12 * - - - - - - - - - - - - - - - - - - 13 * 14 * and 'Table2' in this other way -6 Not_defined -4 Not_defined -2 Not_defined 0 * 2 * 4 * 6 * 8 * 10 * 12 * 14 * ********************END Unfortunately the first three lines are enough to confuse the synchronization procedure of the filter, which is based on a byte-by-byte comparison with exclusion of the field delimiters, as explained before. You can check that this is definitely the case by looking at the output of the command 'sdiff -W' on the transformed files, which is -6 * | -6 Not_defined -5 * | -4 Not_defined -4 * | -2 Not_defined -3 * < -2 * < -1 * < 0 * 0 * - - - - - - - - - < 1 * < 2 * 2 * 3 * < 4 * 4 * - - - - - - - - - < 5 * < 6 * 6 * 7 * < - - - - - - - - - < 8 * 8 * 9 * < 10 * 10 * 11 * < 12 * 12 * - - - - - - - - - < - - - - - - - - - < 13 * < 14 * 14 * > ********************END If we give the command 'numdiff -z 1:2 -Z 2:2 -f Table1 Table2' instead of 'numdiff -z 2 -f Table1 Table2', the second field of the lines of 'Table2' is always blurred. The filter transforms then 'Table2' into -6 * -4 * -2 * 0 * 2 * 4 * 6 * 8 * 10 * 12 * 14 * ********************END and re-synchronizes the files 'Table1' and 'Table2' in the right way. Using the unconditional blurring is suggested in all cases when a certain field, which you want to include in the comparison (use '-X' to completely neglect one or more fields), is of numeric type in almost all lines of (one of) the given files. This can be for instance the case when in some lines the contents of the field are given by a special numeric value, like Infinity, Inf, +Inf or -Inf, or by NaN, abbreviation for Not a Number. Concerning the numeric fields which are not blurred, it is worth remarking that the filter is not confused by differences in the numeric format. Before the byte-by-byte comparison, numeric values are converted indeed to a standard format. To offer an example of this, let us suppose that 'short1' contains a list of numbers with their logarithms 0.001 -3 0.01 -2 0.1 -1 1 0 1000 3 1000000 6 1000000000 9 and 'short2' the same list of numbers and logarithms, but with differences in the numeric format: ****************** 0.0010000 -3 .0100 -2 0000.10 -1 1. 0 1,000.000 3 1,000,000. 6 1,000,000,000 9 Then 'numdiff -f -z 2- short1 short2' displays > ****************** 0.001 -3 0.0010000 -3 0.01 -2 .0100 -2 0.1 -1 0000.10 -1 1 0 1. 0 1000 3 1,000.000 3 1000000 6 1,000,000. 6 1000000000 9 1,000,000,000 9 +++ File "short1" differs from file "short2" showing that the filter has matched the lines in the right way. The filter can even handle the case when the same numerical value is written in decimal notation in one file and in scientific notation in the other one. If the files 'decimal' and 'scientific' contain .001 -3 .01 -2 .1 -1 * * * * * * * * * 1 0 1000 3 1000000 6 1000000000 9 and ***************** 1.0e-3 -3 1.0e-2 -2 1.0e-1 -1 1.0e0 0 1.0e3 3 1.0e6 6 1.0e9 9 ***************** respectively, then 'numdiff -f -z 2- decimal scientific' prints > ***************** .001 -3 1.0e-3 -3 .01 -2 1.0e-2 -2 .1 -1 1.0e-1 -1 * * * * * * * * * < 1 0 1.0e0 0 1000 3 1.0e3 3 1000000 6 1.0e6 6 1000000000 9 1.0e9 9 > ***************** +++ File "decimal" differs from file "scientific" proving that the filter does not get confused. No problems arise also in the case when for the same field the scientific notation is used in both files. If the files 'sc1' and 'sc2' contain 1.E-3 -3 1.00E-2 -2 1.0E-1 -1 1.0000E0 0 001.0E3 3 +01.000E6 6 1.0E+09 9 1.0E+10 10 * * * * * * * * * * and ***************** 1.0e-003 -3 1.0e-2 -2 1.0e-1 -1 1.0e0 0 +1.0e3 3 1.0e+6 6 1.0e9 9 respectively, then 'numdiff -f -z 2- sc1 sc2' correctly displays > ***************** 1.E-3 -3 1.0e-003 -3 1.00E-2 -2 1.0e-2 -2 1.0E-1 -1 1.0e-1 -1 1.0000E0 0 1.0e0 0 001.0E3 3 +1.0e3 3 +01.000E6 6 1.0e+6 6 1.0E+09 9 1.0e9 9 1.0E+10 10 < * * * * * * * * * * < +++ File "sc1" differs from file "sc2" The filter can even handle an improper use of the scientific notation, meaning for example that it can recognize '123.456E+2' and '1.23456E+4' as equal. We can see this in the case of the files 'Scnot1': ------------------------- 1.2E0 * 1 2.45E-1 * 2 -3.678E-2 * 3 and 'Scnot2': 12E-1 * 1 245E-3 * 2 -0.003678E+1 * 3 'numdiff -f -z 3- Scnot1 Scnot2' displays the report: ------------------------- < 1.2E0 * 1 12E-1 * 1 2.45E-1 * 2 245E-3 * 2 -3.678E-2 * 3 -0.003678E+1 * 3 +++ File "Scnot1" differs from file "Scnot2" which is exactly what you would expect in such a case. Also pretty hard cases do not confuse the filter. If 'Scnot1' is given by 1.2000e0 * 1 02.4500e-1 * 2 -003.678E-2 * 3 and 'Scnot2' is the same file as before, the output of the command 'numdiff -f -z 3- Scnot1 Scnot2' is still right: 1.2000e0 * 1 12E-1 * 1 02.4500e-1 * 2 245E-3 * 2 -003.678E-2 * 3 -0.003678E+1 * 3 +++ Files "Scnot1" and "Scnot2" have the same structure In all examples above the option '-f' is used with no argument. However, '-f' accepts an optional argument, which can be used to control how '-f' displays its output. If you provide an argument, care not to leave any space between the option and the argument: '-f60' is correct while '-f 60' makes Numdiff terminate after printing an error message. If the argument is a positive number NUM, then the side-by-side output produced by '-f' will be NUM columns wide. The default value for the width of the output is 130, which can fit onto a traditional printer line, and is the one used when '-f' has no argument, or the supplied argument is zero. In other words, '-f' and '-f0' are just easier to remind versions of '-f130'. A negative argument has the same effect as the positive argument with the same absolute value, but it causes in addition the removal of common lines from the output. For example, the command 'numdiff -z 1:2 -Z 2:2 -f-130 Table1 Table2' displays the following text -5 2.236068 < -3 1.732051 < -1 1.000000 < - - - - - - - - - < 1 1.000000 < 3 1.732051 < - - - - - - - - - < 5 2.236068 < 7 2.645751 < - - - - - - - - - < 9 3.000000 < 11 3.316625 < - - - - - - - - - < - - - - - - - - - < 13 3.605551 < > ********************END +++ File "Table1" differs from file "Table2" In conjunction with the option '-f' or '-O' you can use '-T' to expand tabs to spaces in the produced output. This is useful to preserve the alignment of tabs in the input files, if it is thrown off by the presence of the gutter. The options '-H' and '-m' affect the performance of the filter of Numdiff. But performance has more than one dimension and these options improve one aspect of performance at the cost of another, or they improve performance in some cases while hurting it in others. The re-synchronization of the two compared files made by the filter always comes up with a near-minimal set of deletions/insertions of lines, that usually is good enough for practical purposes. If the filter displays a large set of line deletions/insertions, you might want it to use a modified algorithm that sometimes produces a smaller set of differences. The '-m' option does this; however, it can also cause the filter to run more slowly than usual, so it is not the default behavior. If the files you are comparing are large and have small groups of changes scattered throughout them, you can use the '-H' option to make a different modification to the algorithm employed by the filter. If the input files have a constant small density of changes, where change means here deletion/insertion of lines, this option speeds up the comparison without changing the output or in the worst case introducing minor modifications. 9 Warnings ********** * Bug reports have to be sent to the address . Please, put Numdiff in the subject and indicate the version of the operating system you are running (in particular, do not forget to specify if it is a 32- or a 64-bit system), and, if you know it, the version of the compiler used to build Numdiff. Please write also whether your version of Numdiff uses the GNU MP library or not. Before writing an email be sure to run the latest stable version of Numdiff, I do not provide support for older versions. * Numdiff does not accept numbers in scientific notation whose exponents lie outside the range -1073741824, ..., +1073741824. If such a number is found in any of the files to compare, the execution of the program is stopped after printing a suitable error message on stderr. Under the assumption that the numeric format in use is the default one, with "1.0001e-2147483640" the displayed error messages is numdiff: A number with a too small exponent has been found, namely "1.0001e-2147483640". Exponents smaller than -1073741824 are not accepted, the execution of the program ends now * If Numdiff has been built with its own internal support for multiple precision arithmetic instead of being linked against the GNU MP Library, then performance degradation and memory exhaustion can already make impossible to handle exponents of magnitude 10^6 = 1000000. This is what I obtained on my laptop, equipped with a dual core processor @1.50 GHz and with 1GB of RAM, when I tried to compare the numbers 1.101e1000000000 and 1.0e1000000000: numdiff: Insufficient memory for new allocation, the execution of the program ends now In addition, you can overload the processor with numbers whose exponents lie outside the range -1000000, ..., 1000000. But at least on my machine, everything works fine and quick enough as long as exponent and size of the mantissa of the numbers are in the range -1000, ..., 1000. Be careful and remember that Numdiff is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Consider also that, if you have numeric data with exponents outside the range -300, ..., 300, probably there is something wrong with your data: either you are using the wrong scale, or you should replace very small numbers, like 1e-100, by zero, or it is quite likely that the machine/program/algorithm which produced these data is not working right. * If Numdiff has been linked against the GNU Multiple Precision Arithmetic Library (also called GNU MP), then the precision it uses is typically higher than the specified one. On my machine the actual value of the precision is 20 if the user gives a value between 0 and 20, 30 if the user specifies a precision between 21 and 30, 40 for a user-specified value between 31 and 40, and so on. Anyway, the actual precision is never less than the one required by the user. * After reading a numeric field, Numdiff truncates its value if this number has too much digits with respect to the current precision. To be precise, denoted by P the current value of the precision, the following rules apply. If 'numdiff' has been built with its own internal support for multiple precision arithmetic, then * if the number is written in ordinary decimal notation, 'numdiff' will consider, in addition to all digits of the integer part, only the first P digits of the fractional part; * if the value is written in scientific notation, then 'numdiff' will only consider the first P digits of the fractional part of the mantissa. If 'numdiff' uses the GNU MP library to perform its computations, the value of a numeric field is first translated into scientific notation and then only the first P digits of the fractional part of the mantissa are considered. By current value of the precision I mean the integer value specified by the option '-#', or the default one (35) when this option is not in use. * You can find out whether your local version of 'numdiff' is relying on GNU MP or not by executing the command 'numdiff -v'. If 'numdiff' uses GNU MP, then this command will display the following message or similar (possibly translated into your mother language) among other information: The software has been linked against the GNU Multiple Precision Arithmetic Library, version number 4.2.4. If 'numdiff' does not rely on GNU MP, then the displayed message will be (up to translation into your mother language) The software has been built with its own internal support for multiple precision arithmetic. * Numdiff can only be used on text files: the program terminates after printing a suitable error message if one of the files to compare turns out to be a binary file. To detect if a file is binary or not, 'numdiff' checks for the presence of null bytes (0x00) in the file. * If you are not including the so called white-space characters (usually ' ', '\t', '\f', '\v' and '\r') in the set of field delimiters, then a real and an imaginary number which are separated just by white-spaces can be coupled together and considered as a whole complex number. For example, if you are using only *colon* (':') and *newline* as field delimiters and Numdiff finds a line like that ::::3.0-5.6e-356i::::-12.9 +4.34i::::-12.9 4.34i::::New York:::: then it will consider this line as formed by four fields, the first two are numeric and given by the complex numbers 3.0-5.6e-356i and -12.9+4.34i, the last two ones are the strings New York and -12.9 4.34i. I still do not know if I will modify this in the next version of Numdiff, so that the program recognizes only 3.0-5.6e-356i as numeric field and treats -12.9 +4.34i as non-numeric due to the presence of spaces in the middle. -12.9 4.34i is already considered as non-numeric due to the absence of a leading sign in the imaginary value. * We have seen that one of the two files passed to 'numdiff' can be -, which refers to stdin (standard input). In this way one of the two files to compare can be the output produced by another command, like in 'cat file2 | numdiff -a 1.0e-3 file1 -'. However, if you activate the filter by means of the options '-z' or/and '-Z', Numdiff can not work with the standard input unless you use also the option '-f'. Therefore, the command 'cat file2 | numdiff -a 1.0e-3 -z @ file1 -' displays only the error message numdiff: -: Illegal seek (or maybe the translation of this message in the language you are using on your computer) but 'cat file2 | numdiff -a 1.0e-3 -z @ -f file1 -' works as expected. * This manual describes the version 5.9 of Numdiff. Prior 5.x versions did not recognize all the options that are currently accepted, versions 4.0.0 and 3.x used even a different format for the output. Appendix A GNU Free Documentation License ***************************************** Version 1.3, 3 November 2008 Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The "publisher" means any person or entity that distributes copies of the Document to the public. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements." 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See . Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING "Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. "Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents ==================================================== To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (C) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. Index ***** * Menu: * Acknowledgments: Acknowledgments. (line 55) * Build: Installing. (line 1031) * Caveats: Warnings. (line 3683) * Command line options for ndselect: Invoking ndselect. (line 2867) * Command line options for numdiff: Invoking numdiff. (line 1139) * Compile: Installing. (line 1031) * Copying Conditions: Copying. (line 39) * Diagnostics (ndselect): Invoking ndselect. (line 2867) * Diagnostics (numdiff): Invoking numdiff. (line 1139) * FDL: GNU Free Documentation License. (line 3821) * Filter: Filtering. (line 2959) * Filter output (numdiff): Filter output. (line 957) * Format of the reports: Output format. (line 575) * GNU FDL: GNU Free Documentation License. (line 3821) * GNU Free Documentation License: GNU Free Documentation License. (line 3821) * GNU General Public License: Copying. (line 39) * GPL: Copying. (line 39) * How to use numdiff: Overview. (line 71) * Install: Installing. (line 1031) * Introduction: Overview. (line 71) * Invoking ndselect: Invoking ndselect. (line 2867) * Invoking numdiff: Invoking numdiff. (line 1139) * License: Copying. (line 39) * ndselect (introduction to its use): ndselect. (line 2734) * Notes: Warnings. (line 3683) * Options, command line (ndselect): Invoking ndselect. (line 2867) * Options, command line (numdiff): Invoking numdiff. (line 1139) * Output format (numdiff): Output format. (line 575) * Overview mode of numdiff: Overview mode. (line 736) * Predefined settings of numdiff: Invoking numdiff. (line 1139) * Purposes: Overview. (line 71) * Raw output format: Raw output. (line 1005) * Side-by-side report (numdiff): Overview mode. (line 736) * Synopsis (ndselect): Invoking ndselect. (line 2867) * Synopsis (numdiff): Invoking numdiff. (line 1139) * Thanks: Acknowledgments. (line 55) * Tools: ndselect. (line 2734) * Usage of numdiff: Overview. (line 71) * Warnings: Warnings. (line 3683) numdiff-5.9.0/docs/numdiff.info0000644000175000017500000057242013054341114015744 0ustar paologpaologThis is numdiff.info, produced by makeinfo version 5.2 from numdiff.txi. _"...und der eignen Kraft vertrauend steigt ein frei Geschlecht empor!"_ This manual describes how to install and use Numdiff, a program which compares putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in *note GNU Free Documentation License::. INFO-DIR-SECTION Text creation and manipulation START-INFO-DIR-ENTRY * Numdiff: (numdiff). Comparing files containing numeric fields (and not only) END-INFO-DIR-ENTRY  File: numdiff.info, Node: Top, Next: Copying, Prev: (dir), Up: (dir) Numdiff User Manual ******************* _"...und der eignen Kraft vertrauend steigt ein frei Geschlecht empor!"_ This manual describes how to install and use Numdiff, a program which compares putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in *note GNU Free Documentation License::. * Menu: * Copying:: Numdiff Copying Conditions (GPL) * Acknowledgments:: Acknowledgments * Overview:: Introduction to numdiff * Installing:: How to install numdiff * Invoking numdiff:: How to use numdiff * ndselect:: (numdiff) ndselect. Selecting lines and fields * Invoking ndselect:: How to use ndselect * Filtering:: How to use the filter of numdiff * Warnings:: Various recommendations * GNU Free Documentation License:: The license covering this document * Index:: Complete index  File: numdiff.info, Node: Copying, Next: Acknowledgments, Prev: Top, Up: Top 1 Copying ********* Numdiff (also written numdiff) is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Numdiff 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 .  File: numdiff.info, Node: Acknowledgments, Next: Overview, Prev: Copying, Up: Top 2 Acknowledgments ***************** I want to thank Mr. Norman Clerman for several suggestions he gave me to improve the readability and the effectiveness of the output produced by Numdiff. He also pointed out the need to implement a filter to resynchronize the lines between two files in case of addition or deletion of one or more lines. I have to give him credit for the urge to prepare the versions 4.x and 5.x of Numdiff. Moreover, I want to thank my friends Mariapia Palombaro, since she removed some errors while reviewing the first version of this document, and Paolo Caramanica, who suggested me to add more information to the output of the option '-S'.  File: numdiff.info, Node: Overview, Next: Installing, Prev: Acknowledgments, Up: Top 3 Overview ********** Computer users often find occasion to ask how two files differ. Perhaps one file is a newer version of the other file. Or maybe the two files started out as identical copies but were changed by different people. There are several ways to look at the differences between two files. One way consists in looking at the series of lines that were deleted from, inserted in, or changed in one file to produce the other file. The well-known 'diff' program compares two files line by line, finds groups of lines that differ, and reports each group of differing lines. Without particular options, when comparing lines the 'diff' program considers any change in the amount or in the type of the characters as a difference. However, trough some command line options the user can suppress the output of certain kinds of differences that are not important to him. For instance, 'diff' provides options to ignore differences in the amount of white space between words or lines, or differences in alphabetic case. Another way to look at the differences between two files consists in considering the words that were deleted from, inserted in, or changed in one file to produce the other file. Here "word" refers to a sequence of non white-space characters delimited by a couple of white-spaces, one before and the other one after the word. The 'wdiff' program by Franc,ois Pinard compares words in two files and reports the differences. Finally, one can regard the differences between two files as a sequence of pairs of differing bytes. The 'cmp' program reports the differences between two files byte by byte, instead of line by line or word by word. As a result, it is often more useful than 'diff' or 'wdiff' for comparing binary files. However, none of these approaches turns out to be good when you want to compare a couple of text files composed partially or entirely by numerical fields. In such a case what you want to obtain usually is a list of the numerical fields in the second file which *numerically* differ from the corresponding fields in the first file. But, while a number can be written using different notations, programs like 'diff' or 'wdiff' can not recognize whether a difference between two numeric fields is only due to the notation or is actually a difference of numerical values. For instance, 11.23 and 11.2300000 are the same number but represented in different ways. If you are interested in the numerical values, the difference in the representation is not meaningful and then should be ignored. However, 'diff' and 'wdiff' always consider the previous one as an actual difference: there is no way for you to tell these programs to ignore it. Another example of this type is given by 98765.4321 and 9.87654321E04. Here the difference is only due to the use of the scientific notation in place of the ordinary decimal notation. In addition, depending on your country you could stick to different conventions in writing numbers. For example, the amount "three hundred millions and fifty-two thousands of dollars and forty-six cents" is usually written by an Italian accountant as 300.052.000,46$ while an American accountant would write 300,052,000.46$. Of course, 300.052.000,46$ and 300,052,000.46$ represent the same amount of money but 'diff' and 'wdiff' would report a difference, which probably is not what you want in such a case. Lastly, sometimes you could wish to ignore even differences in numerical values as long as they do not exceed a certain threshold. In other words, you could desire to suppress the report of all "small" numerical differences. For example, it could happen that you want to ignore all numerical differences whose absolute value is not greater than 0.0001. If this is the case, then the numerical fields 33 and 33.00009 should be considered equal, while 33 and 33.00011 should be reported as different. However, 'diff' and 'wdiff' can not be used to ignore small numerical differences, since they do not even know what a numerical difference is. These are the reasons why I decided to implement a new program with the capability to appropriately compare files containing numerical fields. In writing this program I was inspired by 'ndiff', a GPL'ed software by Nelson H. Baabe of the Salt Lake City University. 'ndiff' is actually a good tool, and I used it for a while. But I did not completely like the way it works, and so 'numdiff' was conceived. Although 'ndiff' inspired 'numdiff', they are completely different from the viewpoint of the source code: 'numdiff' has been entirely written from scratch with the addition of code coming from GNU bc, GNU diff and GNUlib. In addition, the last versions of Numdiff offer much more features than 'ndiff' does. 'numdiff' can be used to compare putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. 'numdiff' takes two mandatory arguments, the paths of the two files to compare, and, after splitting them into lines and the lines into fields according to a given list of field delimiters, it compares every field of every line of the first file with the corresponding field of the second file. What _corresponding_ here exactly means depends on the options passed to the program on the command line. With no options, corresponding means the field of the second file at the same position, where position refers both to the line number and to the location within the line. If the compared fields are both legal numerical values, then 'numdiff' performs a numerical comparison between them, otherwise it performs a literal comparison, i.e. the usual byte-by-byte comparison. In case of literal comparison, two fields are regarded as equal if they are formed by the same sequence of characters. In case of numerical comparison and without specific command line options, two fields are regarded as equal if their numerical difference is zero. Mind that, if you do not explicitly specify a list of field delimiters by means of the option '-s' or '-D', 'numdiff' takes as field delimiters the characters newline ('\n', ASCII code 0x0A), horizontal tabulation ('\t', ASCII code 0x09), and blank (' ', ASCII code 0x20). For example, if the file 'list1' contains the data accident 123 23Joshua 34.55 +3+4i water dog -3455.321 cat 2.345678e-9 .0005-6.23e2i and file 'list2' contains the data Accident 123 23456 34.5500 +3.0001+4i dog -3455.320098 Cat +2.345678e-9 -6.23e2i $$$ A new line then the output of the command 'numdiff list1 list2' will be: ---------------- ##1 #:1 <== accident ##1 #:1 ==> Accident @ @@ ##1 #:3 <== 23Joshua ##1 #:3 ==> 23456 @ @@ ##1 #:5 <== +3+4i ##1 #:5 ==> +3.0001+4i @ Absolute error = 1.0000000000e-4, Relative error = 2.0000000000e-5 ##1 #>6 <== water ##1 ==> @ Line 1 in file "list2" is shorter than expected! ---------------- ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 ##2 #:3 <== cat ##2 #:3 ==> Cat @ @@ ##2 #:5 <== .0005-6.23e2i ##2 #:5 ==> -6.23e2i @ Absolute error = 5.0000000000e-4, Relative error = 8.0256821830e-7 ##2 <== ##2 #>6 ==> $$$ @ Line 2 in file "list1" is shorter than expected! ---------------- ##3 <== ##3 #>1 ==> A new line @ Line 3 in file "list1" is shorter than expected! ---------------- <== ##4 ==> +++ File "list1" differs from file "list2" At the same time 'numdiff' will print the following error message on stderr: *** End of file "list1" reached while trying to read line 4. File "list2" has more lines than file "list1", line 4 is the last one read from file "list2" It is worth remarking that 'numdiff' can recognize complex numbers, provided that they are written in the form a+bi or a-bi with no extra characters between the values a, b and the sign + or - (the symbol i, used to represent the imaginary unit, can be changed by a suitable command line option, *note Invoking numdiff::). Do not worry if you do not know what complex numbers are: probably you will never manage files containing complex numbers, thus you can live happily without them. :) We consider now an example which shows how Numdiff can resynchronize the lines between two files in case of addition or deletion of one or more lines. The versions of Numdiff prior to 5 did not work well if one of the two files to compare contains in the middle some lines more or less than the other one. For instance, if you have one file that is 1000 lines long that you are comparing to a second file 1001 lines long, and except for that one extra line, located, let us say, at line 500, the files are identical, then 'numdiff' version 4.x does *not* show only the one line difference: once the files are out of synchronization 'numdiff' 4.x reports every line as different. Since version 5 it is possible in such cases to activate a filter which handles additions and deletions of lines. There are several options ruling how the filter actually works, and I will give later a detailed explanation on how to use them to obtain each time the wished result. The simplest way to activate the filter consists in using the option '-z @'. If 'bill1' and 'bill2' are given by Month Expenses ------------------------- Jan09 $ 233.56 Feb09 $ 850.77 Mar09 $ 12.55 Apr09 $ 524.00 May09 $ 78.25 Jun09 $ 230.00 Jul09 $ 443.10 Aug09 $ 67.65 Sep09 $ 10.00 Oct09 $ 201.45 Nov09 $ 110.00 Dec09 $ 200.27 ------------------------- Total $ 2961.60 and Month Expenses Jan09 $ 234.00 Mar09 $ 13.00 May09 $ 78.25 Jul09 $ 443.10 Sep09 $ 10.00 Nov09 $ 110.00 Jan10 $ 200.00 ------------------------- Total $ 1088.35 respectively, then the differences between the two files are: * the insertion of the separator ------------------------- in 'bill1' before the list of the months, * the deletion in 'bill2' of the lines related to the expenses for the months February, April, June, August, October, December, * small changes in 'bill2' to the expenses of the months January 2009 and March, * the presence in 'bill2' of an entry for January 2010 just before the separator -------------------------, * the addition of an empty line to 'bill2' after the separator -------------------------, * and the different values for the total sum of the expenses. The output of the command 'numdiff -z @ -V bill1 bill2' (I have added here the option '-V' to let Numdiff show which couples of lines it is comparing each time) shows exactly the expected differences: ---------------- ##2 <== ------------------------- ==> ---------------- ##3 <== Jan09 $ 233.56 ##2 ==> Jan09 $ 234.00 ##3 #:3 <== 233.56 ##2 #:3 ==> 234.00 @ Absolute error = 4.4000000000e-1, Relative error = 1.8838842268e-3 ---------------- ##4 <== Feb09 $ 850.77 ==> ---------------- ##5 <== Mar09 $ 12.55 ##3 ==> Mar09 $ 13.00 ##5 #:3 <== 12.55 ##3 #:3 ==> 13.00 @ Absolute error = 4.5000000000e-1, Relative error = 3.5856573705e-2 ---------------- ##6 <== Apr09 $ 524.00 ==> ---------------- ##8 <== Jun09 $ 230.00 ==> ---------------- ##10 <== Aug09 $ 67.65 ==> ---------------- ##12 <== Oct09 $ 201.45 ==> ---------------- ##14 <== Dec09 $ 200.27 ##8 ==> Jan10 $ 200.00 ##14 #:1 <== Dec09 ##8 #:1 ==> Jan10 @ @@ ##14 #:3 <== 200.27 ##8 #:3 ==> 200.00 @ Absolute error = 2.7000000000e-1, Relative error = 1.3500000000e-3 ---------------- <== ##10 ==> ---------------- ##16 <== Total $ 2961.60 ##11 ==> Total $ 1088.35 ##16 #:3 <== 2961.60 ##11 #:3 ==> 1088.35 @ Absolute error = 1.8732500000e+3, Relative error = 1.7211834428e+0 +++ File "bill1" differs from file "bill2" Looking at the displayed report we see that: * the second line of file 'bill1', i.e. the one containing the separator, has no correspondance, or, if you prefer, has been deleted from file 'bill2'. * The lines related to the months January and March 2009 have been slightly modified in 'bill2', namely the values of the expenses are slightly different. Notice that the line with the expenses for January 2009 is the third one in file 'bill1' and the second one in file 'bill2'. This information is printed by Numdiff in the form ##3 <== Jan09 $ 233.56 ##2 ==> Jan09 $ 234.00 Analogously, ##5 <== Mar09 $ 12.55 ##3 ==> Mar09 $ 13.00 says that the line for March is the fifth one in 'bill1' and the third one in 'bill2'. * The line related to the total amount of the expenses appears also differently in the two files, since the amount of the expenses is different. Notice that this line is the 16th one in file 'bill1' and the 11th one in file 'bill2'. * The lines related to the months February, April, June, August and October, i.e. the lines no. 4, 6, 8, 10, and 12 of 'bill1', are not present in 'bill2'. * The line of 'bill1' with the expenses for December 2009 is replaced in 'bill2' by the line containing the value of the expenses for January 2010. * The tenth line of 'bill2', i.e. the empty line after the separator, is not present in 'bill1'. With respect to 'bill1' this line represents then an addition. If you compare 'bill1' and 'bill2' without using the option '-z @', the result is completely misleading. This is the output of 'numdiff -V bill1 bill2': ---------------- ##2 <== ------------------------- ##2 ==> Jan09 $ 234.00 ##2 #:1 <== ------------------------- ##2 #:1 ==> Jan09 @ @@ ##2 <== ##2 #>2 ==> $ 234.00 @ Line 2 in file "bill1" is shorter than expected! ---------------- ##3 <== Jan09 $ 233.56 ##3 ==> Mar09 $ 13.00 ##3 #:1 <== Jan09 ##3 #:1 ==> Mar09 @ @@ ##3 #:3 <== 233.56 ##3 #:3 ==> 13.00 @ Absolute error = 2.2056000000e+2, Relative error = 1.6966153846e+1 ---------------- ##4 <== Feb09 $ 850.77 ##4 ==> May09 $ 78.25 ##4 #:1 <== Feb09 ##4 #:1 ==> May09 @ @@ ##4 #:3 <== 850.77 ##4 #:3 ==> 78.25 @ Absolute error = 7.7252000000e+2, Relative error = 9.8724600639e+0 ---------------- ##5 <== Mar09 $ 12.55 ##5 ==> Jul09 $ 443.10 ##5 #:1 <== Mar09 ##5 #:1 ==> Jul09 @ @@ ##5 #:3 <== 12.55 ##5 #:3 ==> 443.10 @ Absolute error = 4.3055000000e+2, Relative error = 3.4306772908e+1 ---------------- ##6 <== Apr09 $ 524.00 ##6 ==> Sep09 $ 10.00 ##6 #:1 <== Apr09 ##6 #:1 ==> Sep09 @ @@ ##6 #:3 <== 524.00 ##6 #:3 ==> 10.00 @ Absolute error = 5.1400000000e+2, Relative error = 5.1400000000e+1 ---------------- ##7 <== May09 $ 78.25 ##7 ==> Nov09 $ 110.00 ##7 #:1 <== May09 ##7 #:1 ==> Nov09 @ @@ ##7 #:3 <== 78.25 ##7 #:3 ==> 110.00 @ Absolute error = 3.1750000000e+1, Relative error = 4.0575079872e-1 ---------------- ##8 <== Jun09 $ 230.00 ##8 ==> Jan10 $ 200.00 ##8 #:1 <== Jun09 ##8 #:1 ==> Jan10 @ @@ ##8 #:3 <== 230.00 ##8 #:3 ==> 200.00 @ Absolute error = 3.0000000000e+1, Relative error = 1.5000000000e-1 ---------------- ##9 <== Jul09 $ 443.10 ##9 ==> ------------------------- ##9 #:1 <== Jul09 ##9 #:1 ==> ------------------------- @ @@ ##9 #>2 <== $ 443.10 ##9 ==> @ Line 9 in file "bill2" is shorter than expected! ---------------- ##10 <== Aug09 $ 67.65 ##10 ==> ##10 #>1 <== Aug09 $ 67.65 ##10 ==> @ Line 10 in file "bill2" is shorter than expected! ---------------- ##11 <== Sep09 $ 10.00 ##11 ==> Total $ 1088.35 ##11 #:1 <== Sep09 ##11 #:1 ==> Total @ @@ ##11 #:3 <== 10.00 ##11 #:3 ==> 1088.35 @ Absolute error = 1.0783500000e+3, Relative error = 1.0783500000e+2 ---------------- ##12 <== Oct09 $ 201.45 ==> *** End of file "bill2" reached while trying to read line 12. File "bill1" has more lines than file "bill2", line 12 is the last one read from file "bill1" +++ File "bill1" differs from file "bill2" Numdiff compares now the first, second, third line of 'bill1' with the first, second, third line of 'bill2', and so on. But probably this is not what you want in such a case: what is reasonable here is to compare entries related to the same month and not lines having the same location, i.e. the same line number. Numdiff offers also an option to run just the filter and see how it resynchronizes the two given files without performing any comparison of corresponding lines. The output of 'numdiff -z @ -f bill1 bill2' is Month Expenses Month Expenses ------------------------- < Jan09 $ 233.56 Jan09 $ 234.00 Feb09 $ 850.77 < Mar09 $ 12.55 Mar09 $ 13.00 Apr09 $ 524.00 < May09 $ 78.25 May09 $ 78.25 Jun09 $ 230.00 < Jul09 $ 443.10 Jul09 $ 443.10 Aug09 $ 67.65 < Sep09 $ 10.00 Sep09 $ 10.00 Oct09 $ 201.45 < Nov09 $ 110.00 Nov09 $ 110.00 Dec09 $ 200.27 | Jan10 $ 200.00 ------------------------- ------------------------- > Total $ 2961.60 Total $ 1088.35 +++ File "bill1" differs from file "bill2" and shows that the filter is doing its job in the right way, associating the lines according to the month and not to the line number. Running just the filter is extremely useful in all situations when you are not sure if the filter is working as you wish. You have indeed to instruct the filter in the right way to let it work correctly, and this requires the use of different options depending on the structure of the files to compare. Since guessing the right options can be sometimes tricky, running just the filter and see the result is the best way to be certain that you are setting up everything correctly. Later, *note Filtering::, I will explain in detail * what the filter does behind the scenes to understand if and how it has to resynchronize the files to compare, * and how the related options affect the action of the filter. By the way, it is even possible to use '-f' without any other additional option for the filter, like in 'numdiff -f bill1 bill2', but the result is more or less the same you would obtain by performing a byte-by-byte comparison with removal of the field delimiters. The option '-f' can be followed by an argument in the form of an integer number whose meaning will be explained later, *note Use of the option -f::. Even if the output of 'numdiff' is supposed to be self-explanatory, in the next section I will explain in details all you should know about it. * Menu: * Output format:: How numdiff prints its reports on stdout * Overview mode:: An alternative way to print listings of differences * Filter output:: How the built-in filter prints its report * Raw output:: A compact output format suitable for automated parsing  File: numdiff.info, Node: Output format, Next: Overview mode, Up: Overview 3.1 Output format ================= Let us go back to our first example. If the files 'list1' and 'list2' contain the data accident 123 23Joshua 34.55 +3+4i water dog -3455.321 cat 2.345678e-9 .0005-6.23e2i and Accident 123 23456 34.5500 +3.0001+4i dog -3455.320098 Cat +2.345678e-9 -6.23e2i $$$ A new line respectively, then the output of the command 'numdiff list1 list2' will be: ---------------- ##1 #:1 <== accident ##1 #:1 ==> Accident @ @@ ##1 #:3 <== 23Joshua ##1 #:3 ==> 23456 @ @@ ##1 #:5 <== +3+4i ##1 #:5 ==> +3.0001+4i @ Absolute error = 1.0000000000e-4, Relative error = 2.0000000000e-5 ##1 #>6 <== water ##1 ==> @ Line 1 in file "list2" is shorter than expected! ---------------- ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 ##2 #:3 <== cat ##2 #:3 ==> Cat @ @@ ##2 #:5 <== .0005-6.23e2i ##2 #:5 ==> -6.23e2i @ Absolute error = 5.0000000000e-4, Relative error = 8.0256821830e-7 ##2 <== ##2 #>6 ==> $$$ @ Line 2 in file "list1" is shorter than expected! ---------------- ##3 <== ##3 #>1 ==> A new line @ Line 3 in file "list1" is shorter than expected! ---------------- <== ##4 ==> +++ File "list1" differs from file "list2" 'numdiff' prints a report on the standard output for every field of the first file which differs from the corresponding field of the second file. This report indicates first the locations of the fields, namely the numbers of the lines where the fields appear and their positions within the line. The position in the line is "1" for the first field of a line, "2" for the second field, "3" for the third one, and so on: fields are numerated starting from the left hand of the line and proceeding towards the right hand. For each report the line number is introduced by the symbol "##", while the field number by "#:". Then 'numdiff' shows in what the difference consists. For example, ##1 #:1 <== accident ##1 #:1 ==> Accident @ @@ means that the first field of the first line is "accident" in the first file, while in the second file it appears as "Accident". This difference could be then canceled by removing "accident" from the first file and inserting "Accident" in place of it. The arrows "<==" and "==>" try to visualize this idea. Analogously, ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 means that the second field of the second line is "-3455.321" in the first file and "-3455.320098" in the second one. Since the contents of the field are numerical in both files, 'numdiff' also prints the absolute and relative errors. The absolute error (or absolute difference) is given by the absolute value of the difference between the values appearing in the two files. The relative error (or relative difference) is actually defined in a more complicated way. If _n1_ is the value appearing in the first file and _n2_ is the value in the second file, then the absolute error is given by the formula _A=|n1-n2|_, while the relative error _R_ is given by: * _R = 0_ if _n1_ and _n2_ are equal, * _Inf_ (infinity) if _n2_ differs from _n1_ and at least one of them is zero, * _R = A/ min(|n1|, |n2|)_ if _n1_ and _n2_ are both non zero and _n2_ differs from _n1_. _min(|n1|, |n2|)_ denotes the minimum between the absolute value of _n1_ and the absolute value of _n2_. With these definitions of absolute and relative error it turns out that _A(n2, n1) = A(n1, n2)_ and _R(n2, n1) = R(n1, n2)_. In other words, the absolute/relative error does not change if you only change the order of the compared values. Since version 5 it is actually possible to let Numdiff compute the relative error always with respect to the value from the first file or always with respect to the value from the second file, instead of using the preceding formula. This can be done through the option '-F', *note Alternative formulas for the computation of the relative difference::. If at least one of the compared fields is not numerical, then the output line reporting absolute and relative errors is replaced by the separator: @ @@ It can happen that a line in one of the two files to compare contains more fields than the corresponding line of the other file. If this is the case, 'numdiff' reports this difference by telling that a certain line (identified by its line number) appears to be shorter than expected, just as in ##1 #>6 <== water ##1 ==> @ Line 1 in file "list2" is shorter than expected! or in ##3 <== ##3 #>1 ==> A new line @ Line 3 in file "list1" is shorter than expected! In addition, 'numdiff' shows the tail of the longer line, using the notation "#>n" to indicate the number n of the first field of the longer line for which there is no corresponding field in the shorter line. For example, ##1 #>6 <== water ##1 ==> @ Line 1 in file "list2" is shorter than expected! means that none of the fields of the first line starting from the sixth one has a corresponding field in the second file ('list2'). In this context, the symbol <<*>> (if it appears) is used to denote the End-Of-File, i.e. a line or the tail of a line which is located at the end of the corresponding file and does not have a terminating _newline_ character. It can also happen that one of the two files to compare has less lines than the other one. In this case, if no special option is passed to the program, 'numdiff' prints the number of the first line which appears in only one of the two files and a message on the standard error telling in which of the two files the end has been prematurely reached: *** End of file "list1" reached while trying to read line 4. File "list2" has more lines than file "list1", line 4 is the last one read from file "list2" Unless the option '-q' is used (*note Invoking numdiff::), 'numdiff' prints to the standard output a message reporting the final status of the comparison. This message says either the two files are equal or they are different, just as in the example we are considering: +++ File "list1" differs from file "list2"  File: numdiff.info, Node: Overview mode, Next: Filter output, Prev: Output format, Up: Overview 3.2 Overview mode ================= Since version 5.6 an alternative way to display the differences between two files is available, which can be activated through the option '-O'. If this option is present on the command line, 'numdiff' prints a side-by-side report instead of the usual one. For example, if 'sheet1' contains the text A 1 1 B 2 4 C 3 9 D 4 16 E 5 25 F 6 36 G 7 49 H 8 64 I 9 81 J 10 100 and 'sheet2' the following lines A 1 1 B 2 4 C 3.3 9.03 D 4 16 E 5.5 25.05 F 6.6 36 G 7.7 49.49 H 8 64 I 9.9 81.09 then 'numdiff -O sheet1 sheet2' prints this report A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 :!:C 3.3 9.03 D 4 16 D 4 16 E 5 25 :!:E 5.5 25.05 F 6 36 :!:F 6.6 36 G 7 49 :!:G 7.7 49.49 H 8 64 H 8 64 I 9 81 :!:I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" On the left side you can see the lines coming from the file specified as first on the command line, i.e. 'sheet1', on the right side the lines from the second file of the command line, in this case 'sheet2'. In the middle there is a gutter which contains one of these markers: 'white spaces' The corresponding lines are in common. That is, either the lines are identical, or the difference is ignored because of one of the options '-s', '-D', '-I', '-X', '-a', '-r', '-P', or '-N'. ':!:' The corresponding lines have at least one field which differs. ':<:' The files differ and only the first file contains the line. ':>:' The files differ and only the second file contains the line. In the case of 'sheet1' and 'sheet2' a message is printed after the report saying that the end of the second file has been prematurely reached. The two files do not have indeed the same number of lines and the filter has not been activated. The option '-O' can take an optional argument, which allows to set the width of the output and eventually to suppress common lines, *note Invoking numdiff::. The default value for the width of the side-by-side report is 130. No wonder then that the command 'numdiff -O40 sheet1 sheet2' displays a report with shorter lines: A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 :!: C 3.3 9.03 D 4 16 D 4 16 E 5 25 :!: E 5.5 25.05 F 6 36 :!: F 6.6 36 G 7 49 :!: G 7.7 49.49 H 8 64 H 8 64 I 9 81 :!: I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" A negative argument makes that only the differences are listed in the side-by-side report, as shown by the output of the command 'numdiff -O40 sheet1 sheet2': C 3 9 :!: C 3.3 9.03 E 5 25 :!: E 5.5 25.05 F 6 36 :!: F 6.6 36 G 7 49 :!: G 7.7 49.49 I 9 81 :!: I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" If you set the width of the report to a too small value, it can happen that some or even all lines from the compared files appear truncated as in the output of 'numdiff -O24 sheet1 sheet2': A 1 A 1 B 2 B 2 C 3 :!: C 3.3 D 4 D 4 E 5 :!: E 5.5 F 6 :!: F 6.6 G 7 :!: G 7.7 H 8 H 8 I 9 :!: I 9.9 J 10 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" If you set the width of the report to a very small value, Numdiff ignores it and uses the default value, i.e. 130. Notice that the numeric argument must immediately follow the option '-O', intermediate spaces are not allowed. This is also the case for the optional argument of '-f', while the options of Numdiff which require a mandatory argument permit the presence of intermediate spaces between them and the argument. The option '-O' can be used together with any other option of Numdiff except for '-f', '-q', '-U', '-E', '-V' and '-b'. When '-O' is in use, '-U', '-E', '-V' and '-b' are ignored. If '-q' is present on the command line together with '-O', then '-O' is ignored. Finally, if both '-f' and '-O' are present, then the behavior depends on the order: the option which appears first on the command line is the one which matters. Therefore, the command 'numdiff -O40 -f sheet1 sheet2' displays the same report as 'numdiff -O40 sheet1 sheet2', while the output of 'numdiff -f -O40 sheet1 sheet2' is given by A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 | C 3.3 9.03 D 4 16 D 4 16 E 5 25 | E 5.5 25.05 F 6 36 | F 6.6 36 G 7 49 | G 7.7 49.49 H 8 64 H 8 64 I 9 81 | I 9.9 81.09 J 10 100 < +++ File "sheet1" differs from file "sheet2" and coincides then with the output of 'numdiff -f sheet1 sheet2'. The option '-O' can be used together with the filter to cope with the addition/deletion of lines. If the file 'sheet3' contains the text A 1 1 C 3.3 9.03 E 5.5 25.05 G 7.7 49.49 I 9.9 81.09 J 10 100.00 K 0 0.02 then 'numdiff -O40 sheet1 sheet3' prints a wrong report, as in the example with files 'bill1' and 'bill2': A 1 1 A 1 1 B 2 4 :!: C 3.3 9.03 C 3 9 :!: E 5.5 25.05 D 4 16 :!: G 7.7 49.49 E 5 25 :!: I 9.9 81.09 F 6 36 :!: J 10 100.00 G 7 49 :!: K 0 0.02 H 8 64 :<: *** End of file "sheet3" reached while trying to read line 8. File "sheet1" has more lines than file "sheet3", line 8 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet3" On the other hand, the presence of '-z @' makes Numdiff always compare fields of corresponding lines, as shown by the output of the command 'numdiff -O40 -z @ sheet1 sheet3': A 1 1 A 1 1 B 2 4 :<: C 3 9 :!: C 3.3 9.03 D 4 16 :<: E 5 25 :!: E 5.5 25.05 F 6 36 :<: G 7 49 :!: G 7.7 49.49 H 8 64 :<: I 9 81 :!: I 9.9 81.09 J 10 100 J 10 100.00 :>: K 0 0.02 +++ File "sheet1" differs from file "sheet3" Side-by-side format is easy to read, but it has limitations. It generates much wider output than usual, and truncates lines that are too long to fit. Also, it relies on lining up output quite heavily, so its output looks particularly bad if you use varying width fonts, nonstandard tab stops, or nonprinting characters.  File: numdiff.info, Node: Filter output, Next: Raw output, Prev: Overview mode, Up: Overview 3.3 Output of the filter ======================== The output produced just by running the filter (option '-f') is a side-by-side difference listing of the compared files like the one displayed by GNU sdiff. The files are listed in two columns with a gutter between them. The gutter contains one of the following markers: 'white space' The corresponding lines are in common. That is, either the lines are identical, or the difference is ignored because of one of the options '-s', '-D', '-I', '-X', '-z', or '-Z'. '|' The corresponding lines differ, and they are either both complete or both incomplete. '<' '(' The files differ and only the first file contains the line. '>' ')' The files differ and only the second file contains the line. '\' The corresponding lines differ, and only the first line is incomplete. '/' The corresponding lines differ, and only the second line is incomplete. An input line is incomplete if its last character is not a newline. This can happen only if the line is the last one of its file. When an output line of the side by side difference listing represents two differing lines, one might be incomplete while the other is not. In this case the gutter is marked '\' if the line from the first file is incomplete, '/' if the line from the second file is it. Like '-O', the option '-f' can take an optional argument which allows to set the width of the output and eventually to suppress common lines, *note Invoking numdiff:: and *note Use of the option -f::. More generally, the user can always make 'numdiff' avoid to print, partially or totally, the messages that it would otherwise send to standard output. This can be achieved by some suitable command line options, *note Invoking numdiff::.  File: numdiff.info, Node: Raw output, Prev: Filter output, Up: Overview 3.4 Raw output ============== Since version 5.9 Numdiff can report the results of the comparison of two files in a particularly compact format, which can be easily parsed by other programs. This _raw_ format is chosen by Numdiff whenever the user requests it through the command line option '--raw'. Below you can see an example of raw output in the case of the comparison of the files 'list1' and 'list2' from section *note Output format::: 1:1:1:1:*:*:accident ==> Accident 1:1:3:3:*:*:23Joshua ==> 23456 1:1:5:5:1.0000000000e-4:2.0000000000e-5:+3+4i ==> +3.0001+4i 1:1:6:*:water 2:2:2:2:9.0200000000e-4:2.6104672633e-7:-3455.321 ==> -3455.320098 2:2:3:3:*:*:cat ==> Cat 2:2:5:5:5.0000000000e-4:8.0256821830e-7:.0005-6.23e2i ==> -6.23e2i 2:2:*:6:$$$ 3:3:*:1:A new line *:4 +++ File "list1" differs from file "list2" The raw format is not at all convenient for humans. It has been provided only for being used by the forthcoming graphic user interface of Numdiff (yes, Numdiff will have a GUI sometime in the future!).  File: numdiff.info, Node: Installing, Next: Invoking numdiff, Prev: Overview, Up: Top 4 Installing ************ To successfully compile, build and install Numdiff some tools are required. The first one is an ANSI C compiler. This compiler should at least accept the option '-o' to write its output to a specified file, the option '-D' for macros predefinition, the option '-l' to search for a specified library, and the options '-I' and '-L' to add a given directory to the search path for include and library files respectively. In addition, you need a POSIX implementation of the 'make' utility (I used both GNU make and smake by Joerg Schilling to compile Numdiff) and a POSIX implementation of the commands 'rm' and 'find'. At last, you need a proper installation of GNU Texinfo (in order to install the info documentation) and a shell sh-compatible. Numdiff has been successfully compiled and tested on: * Slackware(R) GNU/Linux 10.2 with the version 3.3.6 of the GNU C Compiler (GCC), * Slackware GNU/Linux 11 with GCC 3.4.6, * Slackware GNU/Linux 12.2 with GCC 4.2.4, * Slackware GNU/Linux 13 with GCC 4.3.3, * Debian(R) GNU/Linux 4.0 with GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21), * Debian GNU/Linux 6.0.3 with GCC 4.4.5 (Debian 4.4.5-8), * Debian GNU/Linux 7.1 with GCC 4.7.2 (Debian 4.7.2-5), * Debian GNU/Linux 8.6 with GCC 4.9.2 (Debian 4.9.2-10), * SunOS(R) 5.8 with GCC 2.95.3, and * SunOS 5.10 (i386) with the version 5.9 of the Sun C compiler. Configuration, building and installation of Numdiff can be performed through the standard three steps: ./configure make make install If you leave enabled the Natural Language Support and you also want to install the localization files (at the moment only the Italian localization is supplied), then after 'make' you will have to type and run make install-nls By default, 'make install' will install all the files in '/usr/local/bin', '/usr/local/info' etc. You can specify an installation prefix other than '/usr/local' using the option '--prefix' in the 'configure' step, for instance '--prefix=$HOME': ./configure --prefix=$HOME For better control, you can use the options '--bindir', '--infodir', and so on. Type './configure --help' to obtain the complete list of all available options. The documentation files (including a full User Manual available in HTML, PDF and plain ASCII text format) will always be put in 'DOCDIR/numdiff', where DOCDIR is the path specified by the option '--docdir' or, if this option has not been given to 'configure', 'PREFIX/local/doc'. Here PREFIX is the installation prefix specified by the option '--prefix' or the default '/usr/local'. Once Numdiff has been installed you can remove all files related to Numdiff by a simple 'make uninstall'. If you have also installed the localization files trough 'make install-nls', use 'make uninstall-nls' in place of 'make uninstall' to remove them too. Between the options accepted by 'configure' there are '--enable-debug', '--enable-optimization', '--enable-nls' and '--enable-gmp'. The option '--enable-debug' turns on debugging when compiling the source code. This is obtained by passing to the compiler the '-g' option, but you can change this default debugging flag (which could not even be recognized by your compiler) by setting the environment variable 'DBGFLAGS' before launching 'configure'. The option '--enable-optimization' turns on basic optimization when compiling the source code. This is obtained by passing to the compiler the '-O' option, but you can change this default flag (which could not even be recognized by your compiler) by setting the environment variable 'OPTFLAGS' before launching 'configure'. The option '--enable-nls' turns on Natural Language Support. You do not need to use it explicitly since Natural Language Support is enabled by default. To disable it, use '--disable-nls'. Disabling Natural Language Support is suggested whenever you want to install Numdiff on a system where the GNU gettext library is not present. In this case the installation of Numdiff can be accomplished, for example, through ./configure --disable-nls make make install Since version 5.2.0 Numdiff uses to perform all computations the GNU Multiple Precision Arithmetic Library (also called GNU MP or GMP), if this library is available at build-time. The old internal support for multiple precision arithmetic is a fall-back in case GNU MP is absent. However, it is possible to use the internal support for multiple precision arithmetic even if GNU MP is available: it is sufficient to pass the option '--enable-gmp=no' or '--disable-gmp' to the configure script before building the program, like in ./configure --disable-gmp make make install Enabling the old internal support for multiple precision arithmetic is deprecated, *note with GNU MP is better::. The latest version of GNU MP is available at . See the GNU MP web page at for up-to-date information on GNU MP.  File: numdiff.info, Node: Invoking numdiff, Next: ndselect, Prev: Installing, Up: Top 5 Invoking numdiff ****************** *SYNOPSIS* numdiff -h|--help|-v|--version or numdiff [-s IFS][-D DELIMS][-a THRVAL[:RANGE|:RANGE1:RANGE2]] [-r THRVAL[:RANGE|:RANGE1:RANGE2]][-2][-F NUM][-# NUM][-P][-N][-I] [-c CURRNAME][-d C1C2][-t C1C2][-g N1N2][-p C1C2][-n C1C2][-e C1C2] [-i C1C2][-X 1:RANGE][-X 2:RANGE][-E][-U][-b][-V][-O[NUM]][--raw][-q][-S] [-z 1:RANGE][-z 2:RANGE][-Z 1:RANGE][-Z 2:RANGE][-m][-H][-f[NUM]] [-T][-B][-l PATH][-o PATH] FILE1 FILE2 where FILE1 and FILE2 are the names of the two files to compare and RANGE, RANGE1 and RANGE2 stay for a positive integer value or for a range of integer values, like '1-', '3-5' or '-7'. In the first case 'numdiff' prints a short help (not so short actually :)) or/and version number, Copyright, License notice, NO-Warranty disclaimer, and some information about the way it was built. In the second case 'numdiff' compares the files specified by the two mandatory arguments which follow the list of the options. The complete paths of the files should be given, a directory name is not accepted. In addition, the two arguments cannot refer to the same file but one of them can be -, which refers to stdin. *OPTIONS* '-s, --separators=IFS' Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline). If IFS is prefixed with '1:' or '2:', use the given delimiter set only for the lines from the first or the second file respectively '-D, --delimiters=DELIMS' Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline). If DELIMS is prefixed with '1:' or '2:', use the given delimiter set only for the lines from the first or the second file respectively '-a, --absolute-tolerance=THRVAL[:RANGE|:RANGE1:RANGE2]' Set to THRVAL the maximum absolute difference permitted before two numeric fields are regarded as different (The default value is zero). If a RANGE is given, use the specified threshold only when comparing fields whose indexes lie in RANGE. If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2 '-r, --relative-tolerance=THRVAL[:RANGE|:RANGE1:RANGE2]' Set to THRVAL the maximum relative difference permitted before two numeric fields are regarded as different (The default value is zero). If a RANGE is given, use the specified threshold only when comparing fields whose indexes lie in RANGE. If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2 '-2, --strict' Consider two numerical values as equal only if both absolute and relative difference do not exceed the respective tolerance threshold '-F, --formula=NUM' Use the formula indicated by NUM to compute the relative errors. If NUM is 0 use the classic formula. If NUM is 1 compute the relative errors by considering the values in FILE1 as sample values. If NUM is 2 compute the relative errors by considering the values in FILE2 as sample values. '-#, --digits=NUM' Set to NUM the number of digits in the significands used in multiple precision arithmetic '-P, --positive-differences' Ignore all differences due to numeric fields of the second file that are less than the corresponding numeric fields in the first file '-N, --negative-differences' Ignore all differences due to numeric fields of the second file that are greater than the corresponding numeric fields in the first file '-I, --ignore-case' Ignore changes in case while doing literal comparisons '-c, --currency=CURRNAME' Set to CURRNAME the currency name for the two files to compare. CURRNAME must be prefixed with '1:' or '2:' to specify the currency name only for the first or the second file '-d, --decimal-point=C1C2' Specify the characters representing the decimal point in the two files to compare '-t, --thousands-separator=C1C2' Specify the characters representing the thousands separator in the two files to compare '-g, --group-length=N1N2' Specify the number of digits forming each group of thousands in the two files to compare '-p, --plus-prefix=C1C2' Specify the (optional) prefixes for positive values used in the two files to compare '-n, --minus-prefix=C1C2' Specify the prefixes for negative values used in the two files to compare '-e, --exponent-letter=C1C2' Specify the exponent letters used in the two files to compare '-i, --imaginary-unit=C1C2' Specify the characters representing the imaginary unit in the two files to compare '-X, --exclude=1:RANGE' Select the fields of the first file that have to be ignored '-X, --exclude=2:RANGE' Select the fields of the second file that have to be ignored '-E, --essential' While printing the differences between the two compared files show only the numerical ones '-U, --dummy' While printing the differences between the two compared files neglect all the numerical ones (dummy mode) '-b, --brief' Suppress all messages concerning the differences discovered in the structures of the two files '-V, --verbose' For every couple of lines which differ in at least one field print an header to show how these lines appear in the two compared files '-O, --overview[=NUM]' Display a side by side difference listing of the two files showing which lines are present only in one file, which lines are present in both files but with one or more differing fields, and which lines are identical. If NUM is zero or is not specified, output at most 130 columns per line. If NUM is a positive number, output at most NUM columns per line. If NUM is a negative number, do not output common lines and display at most -NUM columns per line. '--raw' Display the differences between the two compared files in raw format (not very convenient for humans) '-q, --quiet, --silent' Suppress all the standard output '-S, --statistics' Add some statistics to the standard output '-z, --blur-if-numerical=1:RANGE' Select the fields of the first file that have to be blurred during the synchronization procedure only if they turn out to be numeric '-z, --blur-if-numerical=2:RANGE' Select the fields of the second file that have to be blurred during the synchronization procedure only if they turn out to be numeric '-Z, --blur-unconditionally=1:RANGE' Select the fields of the first file that have to be unconditionally blurred during the synchronization procedure '-Z, --blur-unconditionally=2:RANGE' Select the fields of the second file that have to be unconditionally blurred during the synchronization procedure '-m, --minimal' During synchronization try hard to find a smaller set of changes '-H, --speed-large-files' During synchronization assume large files and many scattered small changes '-f, --test-filter[=NUM]' Run only the filter and then show the results of its attempt to synchronize the two files. If NUM is zero or is not specified, output at most 130 columns per line. If NUM is a positive number, output at most NUM columns per line. If NUM is a negative number, do not output common lines and display at most -NUM columns per line. '-T, --expand-tabs' Expand tabs to spaces in output while displaying the results of the synchronization procedure (meaningful only together with option '-O' or '-f') '-B, --binary' Treat both files as binary files (only meaningful under Doz/Windoz) '-l, --warnings-to=PATH' Redirect warning and error messages from stderr to the indicated file '-o, --output=PATH' Redirect output from stdout to the indicated file '-h, --help' Show help message and predefined settings '-v, --version' Show version number, Copyright, Distribution Terms and NO-Warranty *DIAGNOSTICS* The exit status is 1 if the two given files differ, 0 if they are equal, -1 (255) in case of error. *DEFAULT NUMERIC FORMAT (for both files to compare):* Currency name = "" Decimal point = '.' Thousands separator = ',' Number of digits in each thousands group = 3 Leading positive sign = '+' Leading negative sign = '-' Prefix for decimal exponent = 'e' Symbol used to denote the imaginary unit = 'i' *SOME EXPLANATIONS* The options '-U', '-E', '-b', and '-q' are used to hide part of the standard output of the program according to certain rules. The option '-U' triggers the dummy mode. In this mode 'numdiff' does not print the numerical differences. A numerical difference occurs whenever the compared fields turn out to be both of numerical type, but the field from the second file has a value which differs from the one of the field from the first file. The dummy mode is so called since in this mode 'numdiff' does not perform the job for which I created it. The option '-E' triggers the essential mode. In this mode 'numdiff' only prints the numerical differences between the files and, if there are some, the differences in the structure. The latter ones occur either when one of the files contains a line for which there is no corresponding line in the other file, or when the comparison of corresponding lines shows that one of them contains a field for which there exists no corresponding field in the other line. If you are not running any filter or cutting out any fields through the option '-X', then the differences in the structure simply consist either in a different number of lines in the two files, or in a different number of fields on a line. The option '-b' triggers the brief mode. In this mode 'numdiff' does not print the differences in the structure of the two files (see above for an explanation about what differences in the structure are). The option '-q' triggers the quiet mode. In this mode 'numdiff' does not print anything on the standard output. The quiet mode is useful if you only want to know whether a couple of files are equal or not. This information can be obtained by looking at the exit status of the program. The option '-O' activates the overview mode, which makes 'numdiff' print a side-by-side report in the form described in section *note Overview mode::. The optional numeric argument after '-O' must immediately follow, intermediate spaces are not allowed. The option '-O' can be used together with any other option of Numdiff except for '-f', '-q', '-U', '-E', '-V', '-b', and '--raw'. Whenever '-O' is in use, '-U', '-E', '-V' and '-b' are ignored. If '--raw' or '-q' is present on the command line together with '-O', then '-O' is ignored. Finally, if both '-f' and '-O' are present, the behavior of Numdiff will depend on their order: the option which appears first on the command line is the one which matters. The option '-V' triggers the verbose mode. In this mode 'numdiff' produces a richer report by printing an header whenever the compared lines differ. The header shows how and where these lines appear in the compared files. For instance, if the files 'data1' and 'data2' contain the data 12 33 22 44.5 0.008 1.002 221.12 -34.56 water 2101.21 boats and 12 33 22.3 44.5 0.008 1.202 221.12 -34.56 2101.21 boats dogs respectively, then the command 'numdiff -V data1 data2' will print the following output: ---------------- ##2 <== 22 44.5 ##2 ==> 22.3 44.5 ##2 #:1 <== 22 ##2 #:1 ==> 22.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.3636363636e-2 ---------------- ##3 <== 0.008 1.002 ##3 ==> 0.008 1.202 ##3 #:2 <== 1.002 ##3 #:2 ==> 1.202 @ Absolute error = 2.0000000000e-1, Relative error = 1.9960079840e-1 ---------------- ##4 <== 221.12 -34.56 water ##4 ==> 221.12 -34.56 ##4 #>3 <== water ##4 ==> @ Line 4 in file "data2" is shorter than expected! ---------------- ##5 <== 2101.21 boats ##5 ==> 2101.21 boats dogs ##5 <== ##5 #>3 ==> dogs @ Line 5 in file "data1" is shorter than expected! +++ File "data1" differs from file "data2" Mind that the options '-b' and '-V' will be overridden if '-q' is also set. The amount of additional information printed by '-V' is trivially influenced by the options that alter the way 'numdiff' performs the comparisons between fields (for instance '-a', '-r', '-2', '-N', '-P', '-U', '-E', '-I', '-X'). In the headers printed by 'numdiff' in "verbose mode" the symbol <<*>> can appear. This symbol, if present, is always located at the end of a line to mean that the line is at the end of the corresponding file and does not have a terminating *newline* character. The option '-S' adds to the standard output of 'numdiff' a statistical report with the following information: * the number of numeric comparisons the program has done (this quantity, like the successive ones, is influenced by the options '-P' and '-N') and the number of those ones whose outcome is a major (1) numerical difference. * the largest absolute error in the set of major numerical differences together with the corresponding relative error, and the positions of its first occurrences in the compared files, * the largest relative error in the set of major numerical differences together with the corresponding absolute error, and the positions of its first occurrences in the compared files, * the sum and the arithmetic mean of all absolute errors, * the sum and the arithmetic mean of the major absolute errors, * the square root of the sum of the squares of all absolute errors, * the square root of the sum of the squares of the major absolute errors, * the quadratic mean of all absolute errors, and * the quadratic mean of the major absolute errors. The information printed by '-S' is not removed if this option is used together with '-q', and is not influenced by the option '--raw'. The options '-a', '-r', '-2', '-P' and '-N' affect the way 'numdiff' performs the comparisons between numerical values. Without any of these options, 'numdiff' considers two numerical fields as equal if their difference is zero. The option '-a' can be used to make two numerical fields be considered equal as long as their absolute difference does not exceed a certain threshold, which is specified by the argument that follows the '-a' option. This argument can take several forms. The basic form consists of a single numerical value, the extended form adds the specification of one or two ranges of integer values. Independently of the form of the argument, if the absolute difference between two fields does not exceed the given threshold value, the fields are considered equal; otherwise, 'numdiff' prints the difference in its report, unless some other option, for example '-P' or '-N', makes the difference be neglected. If nothing else follows the threshold value, the rule just explained applies to all comparisons between numerical fields. To see this in practice, if the file 'many_columns1' contains the text A 1 1.2 1 0.1 11.0 1.0e-1 B 2 2.4 4 0.4 24.0 1.0e-2 C 3 3.6 9 0.9 39.0 1.0e-3 D 4 4.8 16 1.6 416.0 1.0e-4 and the contents of the file 'many_columns2' are given by A 1.1 1.08 1.01 0.1 11.011 -1.0e-1 B 2.2 2.16 4.04 0.4 24.024 -1.0e-2 C 3.3 3.24 9.09 0.9 39.039 -1.0e-3 D 4.4 4.32 16.16 1.6 416.039 -1.0e-4 then the output of the command 'numdiff -a 0.5 many_columns1 many_columns2' will be +++ Files "many_columns1" and "many_columns2" are equal The highest absolute difference between a field from 'many_columns1' and the corresponding field from 'many_columns2' is given indeed by |4.32 - 4.8| = |-0.48| = 0.48, and then all numeric differences between the two files remain below the threshold value 0.5. On the other hand, the command 'numdiff -a 0.35 many_columns1 many_columns2' prints the report ---------------- ##3 #:3 <== 3.6 ##3 #:3 ==> 3.24 Absolute error = 3.6000000000e-1, Relative error = 1.1111111111e-1 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:3 <== 4.8 ##4 #:3 ==> 4.32 Absolute error = 4.8000000000e-1, Relative error = 1.1111111111e-1 +++ File "many_columns1" differs from file "many_columns2" since the absolute differences |3.24-3.6| = |-0.36| = 0.36, |4.4-4| = |0.4| = 0.4, and |4.32 - 4.8| = 0.48 exceed the value 0.35, while the other differences are below this threshold. If you want that the specified threshold value applies only when comparing some particular fields, you have to use the extended form for the argument of '-a'. This means that after the threshold value one or two ranges of integer numbers must follow, each preceded by a colon (':'). If you specify only one range of numbers after the threshold value, 'numdiff' uses the given threshold only when comparing fields whose positions lie in the specified range. Remember that the positions of the fields on a line are numbered starting from the left hand of the line and proceeding towards the right hand. For example, '-a 0.01:2-5' sets the threshold value to 0.01 only for the comparisons between numerical fields which occupy on their lines a position between the second and the fifth one inclusive. For the other comparisons the threshold value is left unchanged; in particular, it is equal to zero if it has not been explicitly set. If the files 'many_columns1' and 'many_columns2' are the same as before, then the command 'numdiff -a 0.5:3-6 many_columns1 many_columns2' will display the following report ---------------- ##1 #:2 <== 1 ##1 #:2 ==> 1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:2 ==> 2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:7 <== 1.0e-3 ##3 #:7 ==> -1.0e-3 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:7 <== 1.0e-4 ##4 #:7 ==> -1.0e-4 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns2" since the threshold value 0.5 applies now only when comparing fields in third, fourth, fifth and sixth position, while for the other comparisons the threshold value is the default one, i.e. zero. If you want to specify a non null threshold also for the fields in second and seventh position, you can do it by using the option '-a' more times. The command 'numdiff -a 0.5:3-6 -a 0.25:2 -a 4e-3:7 many_columns1 many_columns2' sets the threshold value to 0.25 for the comparisons between the fields in second position, and to 4e-3 for the comparisons of the fields in seventh position. No wonder then, that the command prints exactly this report: ---------------- ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 +++ File "many_columns1" differs from file "many_columns2" Observe that :2 and :7 are abbreviations of :2-2 and :7-7, respectively. It is even possible to use range expressions like 'M-' or '-N'. The first expression means all fields starting from the Mth one (inclusive) till to the end of line, the second selects all fields from the first one till to the Nth one, both inclusive. If you specify two ranges of numbers after the threshold value and they have the same length (the length of a range is the difference between its maximum and its minimum), 'numdiff' uses the given threshold when comparing a field of the first file lying in the first range with the corresponding field of the second file from the second range. For example, '-a 1e-4:3-5:4-6' sets the threshold value to 0.0001 only for the numerical comparisons of the third, fourth, and fifth field of each line from the first file with the fourth, fifth and sixth field respectively of the corresponding line from the second file. For the other comparisons the threshold value is left unchanged and is in particular equal to zero if it has not been explicitly set. This way to restrict the application of a threshold value is useful in conjunction with the option '-X', which makes 'numdiff' ignore one or more fields from one of the compared files. The file 'many_columns3': A I 1.1 1.08 1.01 0.1 11.011 -1.0e-1 B II 2.2 2.16 4.04 0.4 24.024 -1.0e-2 C III 3.3 3.24 9.09 0.9 39.039 -1.0e-3 D IV 4.4 4.32 16.16 1.6 416.039 -1.0e-4 has one column more than the file 'many_columns1', namely the second one. When comparing 'many_columns1' with 'many_columns3' it is natural then to ignore the second column of the second file. This can be achieved by passing the argument 2:2 to the option '-X' (for a full description of the use of this option, *note Restriction of the comparison to particular fields::). Ignoring the second field of each line of 'many_columns3' implies that the fields in the third column of this file are compared with the corresponding fields of the second column of 'many_columns1', the fields in the fourth column of 'many_columns3' are compared with the ones in the third column of 'many_columns1', and so on. Therefore, if you want to set a threshold value only for the comparisons between some particular fields you have to consider that '-X 2:2' makes 'numdiff' compare the first, second, third, fourth, fifth, sixth, and seventh field of each line of 'many_columns1' with the first, third, fourth, fifth, sixth, seventh, and eighth field respectively of the corresponding line of 'many_columns3'. Therefore, the command 'numdiff -X 2:2 -a 0.5:3-6 many_columns1 many_columns3' will use 0.5 as threshold value only when comparing the third, fourth, and fifth field of a line from 'many_columns1' with the fourth, fifth, and sixth field respectively of the corresponding line of 'many_columns3'. This explains why the report of 'numdiff -X 2:2 -a 0.5:3-6 many_columns1 many_columns3' ---------------- ##1 #:2 <== 1 ##1 #:3 ==> 1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:6 <== 11.0 ##1 #:7 ==> 11.011 Absolute error = 1.1000000000e-2, Relative error = 1.0000000000e-3 ##1 #:7 <== 1.0e-1 ##1 #:8 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:3 ==> 2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:6 <== 24.0 ##2 #:7 ==> 24.024 Absolute error = 2.4000000000e-2, Relative error = 1.0000000000e-3 ##2 #:7 <== 1.0e-2 ##2 #:8 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:3 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:6 <== 39.0 ##3 #:7 ==> 39.039 Absolute error = 3.9000000000e-2, Relative error = 1.0000000000e-3 ##3 #:7 <== 1.0e-3 ##3 #:8 ==> -1.0e-3 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:3 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:6 <== 416.0 ##4 #:7 ==> 416.039 Absolute error = 3.9000000000e-2, Relative error = 9.3750000000e-5 ##4 #:7 <== 1.0e-4 ##4 #:8 ==> -1.0e-4 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns3" does not show the same difference listing of the command 'numdiff -a 0.5:3-6 many_columns1 many_columns2'. If what you want is to obtain the same difference listing of 'numdiff -a 0.5:3-6 many_columns1 many_columns2', then the right command is 'numdiff -X 2:2 -a 0.5:3-6:4-7 many_columns1 many_columns3'. The report printed by this last command is indeed ---------------- ##1 #:2 <== 1 ##1 #:3 ==> 1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:8 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:3 ==> 2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:8 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:3 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:7 <== 1.0e-3 ##3 #:8 ==> -1.0e-3 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:3 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:7 <== 1.0e-4 ##4 #:8 ==> -1.0e-4 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns3" and up to the positions of the fields from 'many_columns3' coincides with the one of 'numdiff -a 0.5:3-6 many_columns1 many_columns2'. The option '-a' can appear more times on the command line. In case of conflicts, the last setting is the one which matters. If you look at the report of the command 'numdiff -a 0.5:3-6 -a 0.08:4 many_columns1 many_columns2' ---------------- ##1 #:2 <== 1 ##1 #:2 ==> 1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:2 ==> 2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:4 <== 9 ##3 #:4 ==> 9.09 Absolute error = 9.0000000000e-2, Relative error = 1.0000000000e-2 ##3 #:7 <== 1.0e-3 ##3 #:7 ==> -1.0e-3 Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:4 <== 16 ##4 #:4 ==> 16.16 Absolute error = 1.6000000000e-1, Relative error = 1.0000000000e-2 ##4 #:7 <== 1.0e-4 ##4 #:7 ==> -1.0e-4 Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns2" you see that 0.08 and not 0.5 is taken as threshold value for the comparison of the fields in fourth position. Finally, if '-a' is not present on the command line, then the default threshold value of zero applies to all comparisons of numerical fields and any non null absolute difference is considered as significant, unless some other option, for example '-P' or '-N', makes 'numdiff' ignore it. The option '-r' can be used to make two numerical fields be considered equal as long as their relative difference does not exceed a certain threshold, which is specified by the argument that follows the '-r' option. As for the option '-a', the argument of '-r' can have several forms. These forms are the same accepted by '-a' and have the same meanings, but the threshold value applies to the relative difference, not to the absolute one. The relative difference is normally defined in this way. If _n1_ is a value from the file specified as first on the command line and _n2_ is the corresponding value from the second file, then the absolute difference is given by the formula _A=|n1-n2|_. The relative difference _R_ is given by: * _R = 0_ if _n1_ and _n2_ are equal, * _Inf_ (infinity) if _n2_ differs from _n1_ and at least one of them is zero, * _R = A/ min(|n1|, |n2|)_ if _n1_ and _n2_ are both non zero and _n2_ differs from _n1_. _min(|n1|, |n2|)_ denotes the minimum between the absolute value of _n1_ and the absolute value of _n2_. With this definition of relative difference it turns out that _R(n2, n1) = R(n1, n2)_: the relative difference does not change if you only change the ordering of the compared files on the command line. There are cases when this default definition of relative error makes no sense. This can happen for instance when one of the files is a sample file containing a list of expected data, which could have been computed theoretically or come from experiments in a laboratory. In this case it is more natural to define the relative difference as the ratio between the absolute difference and the absolute value of the number coming from the sample file. If you use the option '-F' together with the argument 1 (or 2), then Numdiff always compute the relative difference as the ratio between the absolute difference and the absolute value of the number from the first file (the second file, respectively). More precisely, with '-F 1' the relative difference _R_ is computed according to these rules: * _R = 0_ if _n1_ and _n2_ are equal, * _Inf_ (infinity) if _n2_ differs from _n1_ and _n1_ is zero, * _R = |n1-n2|/ |n1|_ if _n1_ is not zero and _n2_ differs from _n1_. With '-F 2' the rules become: * _R = 0_ if _n1_ and _n2_ are equal, * _Inf_ (infinity) if _n2_ differs from _n1_ and _n2_ is zero, * _R = |n1-n2|/ |n2|_ if _n2_ is not zero and _n2_ differs from _n1_. With the last two sets of rules it is not anymore true that _R(n2, n1) = R(n1, n2)_: the relative difference changes, in the general case, together with the ordering of the files on the command line. As a simple example, suppose that FILE1 and FILE2 contain 1 9.9 0.5 440 and 1.2 8 0.51 400 respectively. Then 'numdiff FILE1 FILE2' displays ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 Absolute error = 1.0000000000e-2, Relative error = 2.0000000000e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 Absolute error = 4.0000000000e+1, Relative error = 1.0000000000e-1 +++ File "file1" differs from file "file2" 'numdiff -F 1 FILE1 FILE2' prints ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 Absolute error = 1.9000000000e+0, Relative error = 1.9191919192e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 Absolute error = 1.0000000000e-2, Relative error = 2.0000000000e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 Absolute error = 4.0000000000e+1, Relative error = 9.0909090909e-2 +++ File "file1" differs from file "file2" the output of 'numdiff -F 2 FILE1 FILE2' is ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 Absolute error = 2.0000000000e-1, Relative error = 1.6666666667e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 Absolute error = 1.0000000000e-2, Relative error = 1.9607843137e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 Absolute error = 4.0000000000e+1, Relative error = 1.0000000000e-1 +++ File "file1" differs from file "file2" 'numdiff -F 1 -r 0.195 FILE1 FILE2' displays ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 +++ File "file1" differs from file "file2" and finally, 'numdiff -F 2 -r 0.195 FILE1 FILE2' displays ---------------- ##1 #:2 <== 9.9 ##1 #:2 ==> 8 Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 +++ File "file1" differs from file "file2" The option '-2' is only meaningful when the user specifies a non-zero tolerance threshold for both absolute and relative difference. Without this option 'numdiff' considers two numerical fields equal as long as at least one between absolute and relative difference does not exceed the corresponding threshold. With the option '-2' 'numdiff' regards two numerical fields as equal only if both absolute and relative difference do not exceed the thresholds of tolerance specified for those fields. For example, if FILE1 contains the unique line 100 and FILE2 the line 100.00012 then the output of the command 'numdiff FILE1 FILE2' will be ---------------- ##1 #:1 <== 100 ==> 100.00012 @ Absolute error = 1.2000000000e-4, Relative error = 1.2000000000e-6 +++ File "FILE1" differs from file "FILE2" The output of the commands 'numdiff -a 1.0e-4 FILE1 FILE2' and 'numdiff -r 1.0e-6 FILE1 FILE2' will be the same as above, but 'numdiff -a 1.0e-4 -r 1.3e-6 FILE1 FILE2' and 'numdiff -a 1.3e-4 -r 1.0e-6 FILE1 FILE2' will print the message +++ Files "FILE1" and "FILE2" are equal since the relative difference is 1.2e-6 < 1.3e-6, the absolute difference is 1.2e-4 < 1.3e-4, and it is sufficient that one of them does not exceed its tolerance threshold. On the other hand, the commands 'numdiff -a 1.0e-4 -r 1.3e-6 -2 FILE1 FILE2' and 'numdiff -a 1.3e-4 -r 1.0e-6 -2 FILE1 FILE2' will both print the message ---------------- ##1 #:1 <== 100 ==> 100.00012 @ Absolute error = 1.2000000000e-4, Relative error = 1.2000000000e-6 +++ File "FILE1" differs from file "FILE2" since the option '-2' makes 'numdiff' regard two values as equal only if both absolute and relative difference do not exceed the respective threshold of tolerance. The option '-P' makes 'numdiff' consider two values equal whenever the second one, i.e. the value coming from the file specified as last on the command line, is less or equal than the first one, which is the value coming from the file specified as first on the command line. If the values to compare are complex numbers, saying that the second one is less or equal than the first one means that both real and imaginary part of the second value are not greater than real and imaginary part of the first value, respectively. Finally, the option '-N' makes 'numdiff' consider two values equal whenever the second one, i.e. the value coming from the file specified as last on the command line, is greater or equal than the first one, which is the value coming from the file specified as first on the command line. If the values to compare are complex numbers, saying that the second one is greater or equal than the first one means that both real and imaginary part of the second value are not less than real and imaginary part of the first value, respectively. The options '-B', '-I', '-l', '-o', '-h', and '-v' do not require further explanations. The options '-l' and '-o' are only supplied for the users of poorly designed operating systems, whose default shell does not allow the redirection of standard error and standard output. The option '-I' has no effect on the outcome of numerical comparisons but affects the action of the filter, *note Filtering::. The option '-s' requires as argument a set of characters, which will be taken as field delimiters. It is better to quote the set of the delimiters, just as in the next examples: numdiff -s ' \t\n,;:.' FILE1 FILE2 numdiff -s ' \t\n\r\f\v"\:;' FILE1 FILE2 numdiff -s `` \t\n''' FILE1 FILE2 If you want to include in the set of delimiters also some special characters, e.g. the *blank*, then you must quote it. I recommend you to always use the single quote character (') to enclose the list of the delimiters, since in this way you will prevent any substitution or handling of characters by the shell. 'numdiff' recognizes and interprets the following sequences of characters within the argument passed to the option '-s': * '\a' alert (bell), * '\b' backspace, * '\f' form feed, * '\n' newline, * '\r' carriage return, * '\s' blank, * '\t' horizontal tab, * '\v' vertical tab, * '\\' backslash, * '\NNN' the eight-bit character whose value is the octal value NNN (one to three digits), * '\xHH' the eight-bit character whose value is the hexadecimal value HH (one or two digits). Thus, by passing the string ' \t\n,;:.' as argument for the option '-s' one tells 'numdiff' to use as field delimiters the characters *blank*, *horizontal tab*, *newline*, *comma*, *semicolon*, *colon*, and *dot*. Passing ' \t\n' as argument to the option '-s' is the same as not using at all the option '-s', since *blank*, *horizontal tab*, and *newline* are the default field delimiters. In the list of field delimiters the character *backslash* ('\') is always treated in a special way. If it forms, combined with the subsequent character(s), one of the escape sequences listed above, then it is considered to be an escape character, and the whole escape sequence is decoded as shown above. Otherwise, the *backslash* is just ignored. Therefore, the delimiters specified by the command line numdiff -s' \t\n\\\"' FILE1 FILE2 are *blank*, *horizontal tab*, *newline*, *backslash* and *double quote*, since '\\' and '\"' are interpreted by 'numdiff' as '\' and '"'. Even if I have recommended to enclose the set of delimiters in single quotes, there are cases in which you will be forced to use the double quote character ('"') to enclose the set of field delimiters, e.g. if the single quote character is used itself as field delimiter, like in one of the precedent examples. However, you must take into account that in this case the shell could make some substitutions on the command line before executing 'numdiff'. For instance, if your shell is GNU bash, then (citing the man page of GNU bash) Enclosing characters in double quotes preserves the literal value of all characters within the quotes, with the exception of '$', '`', and '\'. The characters '$' and '`' retain their special meaning within double quotes. The backslash retains its special meaning only when followed by one of the following characters: '$', '`', '"', '\', or **. A double quote may be quoted within double quotes by preceding it with a backslash ... The special parameters * and @ have special meaning when in double quotes ... Therefore, if the set of delimiters is formed by ' ', '\t', '\n', '\' and '"', and you decide to enclose them in double quotes, the 'numdiff' command line should be numdiff -s'' \t\n\\\\\"'' FILE1 FILE2 and not numdiff -s'' \t\n\\\"'' FILE1 FILE2 In the latter case the shell would indeed replace the string ' \t\n\\\"' by ' \t\n\"' and then 'numdiff' would take ' ', '\t', '\n' and '"' as field delimiters. 'numdiff' requires the presence of the *newline* in the set of characters passed to '-s'. The absence of the *newline* in the set of delimiters causes the issue of a warning message and the termination of the program. If you run Numdiff with the option '-B' ('--binary') on files created under MSDog/MSWindoze, then you should put the *carriage return* in the set of field delimiters. Otherwise, this character would be included in all the fields which stay at the end of a line and this would cause some undesirable effects. For instance, a number put at the end of a line would not be regarded as a numerical field by 'numdiff', since 'numdiff' would consider the final *carriage return* as part of the field, and this one would be then qualified as non-numerical. You can specify different delimiters for the two files to compare by putting the prefix '1:' or '2:' in front of the set of characters passed to '-s'. If the argument of '-s' begins with '1:', the characters after this prefix are used as field delimiters only for the file passed as first on the command line. Analogously, if the prefix is '2:', then the characters after it are used as field delimiters only for the file specified as second on the command line. You can also provide an explicit set of delimiters for just one of the files to compare, in which case 'numdiff' uses the default field delimiters *blank*, *tab* and *newline* for the other file. Therefore, with 'numdiff -s '1:: \n' FILE1 FILE2' the program will take *colon*, *blank* and *newline* as delimiters for FILE1, and *blank*, *tab* and *newline* as delimiters for FILE2. The recommendations about quoting the set of delimiters are valid also in presence of a prefix. Starting from version 5.8 'numdiff' allows to specify whole strings as field delimiters instead of single characters. To this purpose the option '-D' is provided. Assume that file 'register1' and file 'register2' contain --A: +1.0--- --B: -2.0--- --C: +3.0--- --D: -4.0--- --E: +5.0--- --F: -6.0--- and --a: +1.1--- --b: -2.2--- --c: +3.3--- --d: -4.4--- --e: +5.5--- --f: -6.6--- respectively. Assume in addition, you would like that the dashes at the begin and at the end of every line are treated as delimiters and then neglected during the line by line comparison. To obtain this you cannot just specify the character - (minus) as delimiter via the option '-s': if you do it, the negative numbers appearing in the two files will be treated as positive, since the minus sign will be regarded as a delimiter. By means of the option '-D' you can tell 'numdiff' to consider the strings -- and --- as field delimiters, but not the single character -. To see this in practice, look at the output of the command 'numdiff -D ': -- --- \s \n' register1 register2': ---------------- ##1 #:1 <== A ##1 #:1 ==> a @ ##1 #:2 <== +1.0 ##1 #:2 ==> +1.1 Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##2 #:1 <== B ##2 #:1 ==> b @ ##2 #:2 <== -2.0 ##2 #:2 ==> -2.2 Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##3 #:1 <== C ##3 #:1 ==> c @ ##3 #:2 <== +3.0 ##3 #:2 ==> +3.3 Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##4 #:1 <== D ##4 #:1 ==> d @ ##4 #:2 <== -4.0 ##4 #:2 ==> -4.4 Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##5 #:1 <== E ##5 #:1 ==> e @ ##5 #:2 <== +5.0 ##5 #:2 ==> +5.5 Absolute error = 5.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##6 #:1 <== F ##6 #:1 ==> f @ ##6 #:2 <== -6.0 ##6 #:2 ==> -6.6 Absolute error = 6.0000000000e-1, Relative error = 1.0000000000e-1 +++ File "register1" differs from file "register2" The argument '-D ': -- --- \s \n'' instructs 'numdiff' to regard every occurrence of a colon (:), of a blank (\s), of a newline (\n), as well as every occurrence of the strings -- and --- as field delimiters. The minus sign in front of the negative numbers is then properly handled. In general the argument to the option '-D' is a blank separated sequence of one or more strings each of which contains no blank. Thus, the general form of the argument to the option '-D' is STRING1 STRING2 ... STRINGN where STRING1, STRING2, and so on are sequences of one or more characters (strings) containing no blank. Mind that at least one of these strings must be '\n'. In addition, if a string contains the newline character, this must be the only one: strings like '#\n', '%%\n', or '\s\n' are not allowed (entering such a string makes the program terminate after issuing a warning message). Since the blank character has a special meaning for the shell, if the argument of '-D' is formed by two or more strings it should be quoted either with a single (''') or with a double quote ('"'). Quoting is also adviced if one of the strings passed to '-D' contains a character (or a sequence of characters) having a special meaning for the shell. For the usage of single and double quoting to delimit the argument of '-D' the same warnings and recommendations apply as for the argument of '-s'. If you want to set as delimiter a string which contains one or more blanks, then you have to make use of the escape sequence '\s', like in the example above: within the argument of '-D' the blank character is always interpreted as a separator of adjacent delimiters. More generally, when writing the argument of '-D' the same escape sequences are allowed as for the argument of '-s'. This turns out to be particularly useful whenever a multibyte character is used as delimiter in (one of) the files to compare. As example consider the comparison between 'ledger1': In Out Jan 1200.00Euro 1000.00Euro Feb 800.40Euro 650.00Euro Mar 1620.50Euro 1500.00Euro Apr 760.00Euro 900.00Euro Total 4380.90Euro 4050.00Euro Difference: +330.90Euro and 'ledger2': In Out Jan 1100.00Euro 1000.00Euro Feb 800.40Euro 750.00Euro Mar 1620.50Euro 1700.00Euro Apr 750.00Euro 900.00Euro Total 4270.90Euro 4350.00Euro Difference: -79.10Euro Since the Euro symbol is attached to all values, 'numdiff' cannot compare them in the proper way if it is run with the default field delimiters, as the output of the command 'numdiff ledger1 ledger2' shows: ---------------- ##3 #:2 <== 1200.00Euro ##3 #:2 ==> 1100.00Euro @ ---------------- ##4 #:3 <== 650.00Euro ##4 #:3 ==> 750.00Euro @ ---------------- ##5 #:3 <== 1500.00Euro ##5 #:3 ==> 1700.00Euro @ ---------------- ##6 #:2 <== 760.00Euro ##6 #:2 ==> 750.00Euro @ ---------------- ##8 #:2 <== 4380.90Euro ##8 #:2 ==> 4270.90Euro @ ##8 #:3 <== 4050.00Euro ##8 #:3 ==> 4350.00Euro @ ---------------- ##10 #:2 <== +330.90Euro ##10 #:2 ==> -79.10Euro @ +++ File "ledger1" differs from file "ledger2" The trick to perform the comparison in the proper way consists in specifying the Euro symbol as field delimiter, in addition to blank, horizontal tabulation and newline. If 'ledger1' and 'ledger2' are encoded in UTF-8, this can be done by using the option '-D' with the argument '\xE2\x82\xAC \s \t \n', since the hexadecimal representation of Euro in UTF8 is given by the byte sequence 0xE2 0x82 0xAC. On my PC the output of the command 'numdiff -D '\xE2\x82\xAC \s \t \n' ledger1 ledger2' shows that with such a choice of the delimiters 'numdiff' performs indeed a numerical comparison of the values contained in the two files: ---------------- ##3 #:2 <== 1200.00 ##3 #:2 ==> 1100.00 Absolute error = 1.0000000000e+2, Relative error = 9.0909090909e-2 ---------------- ##4 #:3 <== 650.00 ##4 #:3 ==> 750.00 Absolute error = 1.0000000000e+2, Relative error = 1.5384615385e-1 ---------------- ##5 #:3 <== 1500.00 ##5 #:3 ==> 1700.00 Absolute error = 2.0000000000e+2, Relative error = 1.3333333333e-1 ---------------- ##6 #:2 <== 760.00 ##6 #:2 ==> 750.00 Absolute error = 1.0000000000e+1, Relative error = 1.3333333333e-2 ---------------- ##8 #:2 <== 4380.90 ##8 #:2 ==> 4270.90 Absolute error = 1.1000000000e+2, Relative error = 2.5755695521e-2 ##8 #:3 <== 4050.00 ##8 #:3 ==> 4350.00 Absolute error = 3.0000000000e+2, Relative error = 7.4074074074e-2 ---------------- ##10 #:2 <== +330.90 ##10 #:2 ==> -79.10 Absolute error = 4.1000000000e+2, Relative error = 5.1833122630e+0 +++ File "ledger1" differs from file "ledger2" If 'ledger1' and 'ledger2' had been saved using a multi-byte encoding different from UTF-8, then the sequence of bytes which corresponds to Euro in this other encoding should have been passed to '-D'. As for '-s', with '-D' you can specify different delimiters for the two files to compare by means of the prefixes '1:' and '2:', like in 'numdiff -D '1:\t \n' -D '2: -- \s \n' first_file second_file'. The recommendations about quoting the set of delimiters are valid also in presence of a prefix. Mind that, if you provide an explicit set of delimiters for just one of the files to compare, 'numdiff' uses the default field delimiters *blank*, *tab* and *newline* for the other file. If you run Numdiff with the option '-B' ('--binary') on files created under MSDog/MSWindoze, you should always include the character '\r' in the set of field delimiters. The option '-s' and '-D' can appear more than once on the command line. In case of conflicts, 'numdiff' assumes as set of delimiters for a given file the one specified last on the command line. By means of the option '-#' the user can set the number of digits in the significands used in multiple precision arithmetic. The default value is 35, the largest admissible value is 180. If 'numdiff' has been linked against the GNU Multiple Precision Arithmetic Library (also called GNU MP), then the precision it uses is typically higher than the specified one. On my machine the actual value of the precision is 20 if the user requests a value between 0 and 20, 30 if the user specifies a precision between 21 and 30, 40 for a user-specified value between 31 and 40, and so on. Anyway, the actual precision is never less than the one requested by the user. Take into account that an higher precision makes the execution of 'numdiff' slower. This is particularly true if 'numdiff' is not using the computational routines from the GNU MP library and the files to compare contain a lot of numerical fields. In addition, mind that 'numdiff' truncates the value of a numerical field if it has too much digits with respect to the current precision. To be precise, denoted by P the current value of the precision, the following rules apply. * If 'numdiff' has been built with its own internal support for multiple precision arithmetic, then * if a number is written in ordinary decimal notation, 'numdiff' will consider, in addition to all digits of the integer part, only the first P digits of the fractional part; * if a value is written in scientific notation, then 'numdiff' will only consider the first P digits of the fractional part of the mantissa. * If 'numdiff' uses the routines from the GNU MP library to perform its computations, the value of a numerical field is first translated into scientific notation and then only the first P digits of the fractional part of the mantissa are considered. You can find out whether your local version of 'numdiff' is relying on GNU MP or not by executing the command 'numdiff -v'. If 'numdiff' uses GNU MP, then this command will display the following message or similar (possibly translated into your mother language) among other information: The software has been linked against the GNU Multiple Precision Arithmetic Library, version number 4.2.4. If 'numdiff' does not rely on GNU MP, then the displayed message will be (up to translation into your mother language) The software has been built with its own internal support for multiple precision arithmetic. By means of the option '-c' the user can qualify a string as a symbol or name for a currency. The string passed as argument to this option is ignored whenever it appears immediately before the first digit of a number. In particular, the presence of this string does not prevent a field from being considered of numeric type. By prefixing the argument of '-c' with '1:' or '2:' it is possible to set the currency name/symbol only for one of the compared files, or to specify different currency names for the two files. As example we consider the files 'money1': Profits Expenses +$430.10 -$300.50 +$750.20 -$550.02 +$876.24 -$720.00 Totals $2056.54 -$1570.52 and 'money2': Profits Expenses USD430.10 -USD300.50 USD750.20 -USD550.02 USD876.24 -USD720.15 Totals 2056.54 -1570.67 To properly compare them, we have to tell 'numdiff' that '$' and 'USD' are the currency symbols for 'money1' and 'money2', respectively. This can be achieved by '-c 1:$' and '-c 2:USD'. The output of the command 'numdiff -c 1:$ -c 2:USD money1 money2' is ---------------- ##5 #:2 <== -$720.00 ##5 #:2 ==> -USD720.15 Absolute error = 1.5000000000e-1, Relative error = 2.0833333333e-4 ---------------- ##7 #:3 <== -$1570.52 ##7 #:3 ==> -1570.67 Absolute error = 1.5000000000e-1, Relative error = 9.5509767466e-5 +++ File "money1" differs from file "money2" as it is reasonable to expect. The argument of '-c' may also be a multi-byte string, in particular a multi-byte string encoded in UTF-8. If your locale uses UTF-8 as encoding, you can write the argument directly in this form. For instance, you can write '-c Euro' to specify as currency name the Euro symbol. If your locale does not use UTF-8 as encoding, or UTF-8 is not supported by your terminal, you may still write an UTF-8 encoded string as a multi-byte string by specifying each single byte of every (multi-byte) character. To this purpose you can use the same octal and hexadecimal escape sequences recognized by the options '-s' and '-D', but then the argument of '-c' has to be quoted to avoid the interpretation of the hexadecimal escape sequences by the shell. For example, if the files to compare are encoded in UTF-8, you can set Euro as currency name by adding '-c '\xE2\x82\xAC'' to the command line of 'numdiff', since the hexadecimal representation of Euro in UTF-8 is given by the sequence of bytes 0xE2 0x82 0xAC. To see this in practice, if 'euro1' contains the text Profits Expenses +Euro430.10 -Euro300.50 +Euro750.20 -Euro550.02 +Euro876.24 -Euro720.00 and 'euro2' the text Profits Expenses +Euro430.10 -Euro300.00 +Euro750.20 -Euro550.02 +Euro876.00 -Euro720.00 then the report of 'numdiff -c '\xE2\x82\xAC' euro1 euro2' is ---------------- ##3 #:2 <== -Euro300.50 ##3 #:2 ==> -Euro300.00 Absolute error = 5.0000000000e-1, Relative error = 1.6666666667e-3 ---------------- ##5 #:1 <== +Euro876.24 ##5 #:1 ==> +Euro876.00 Absolute error = 2.4000000000e-1, Relative error = 2.7397260274e-4 +++ File "euro1" differs from file "euro2" Please consider that '-c' is only provided to let 'numdiff' regard a field as numeric also in presence of a currency name immediately before its first digit: 'numdiff' does not know anything about currencies and can not perform any kind of conversion between them. In addition, mind that the number after the currency name can be written in any format, not only in financial notation. 'numdiff' can even cope with the currency name when it appears in a complex number. For example, with '-c EUR' 'numdiff' considers +EUR12-EUR0.24i and +12-0.24i as equal. The options '-d', '-t', '-g', '-p', '-n', '-e' and '-i' can be used to instruct 'numdiff' about the numeric formats used in the files which it is going to compare. Since the two files to compare do not have to adopt the same numeric format, 'numdiff' allows to specify different numeric formats for them. Each of the options '-d', '-t', '-g', '-p', '-n', '-e', and '-i' can have as argument one or two (single-byte) characters, in particular one or two digits if the option is '-g'. In the first case the argument refers to both files to compare, in the second case the first character is for the file specified first on the command line, the second character for the file specified last. For instance, the option '-d' can be used to tell 'numdiff' which character(s) is(are) used to indicate the decimal point in the two files to compare. If you give the command 'numdiff -d_ FILE1 FILE2', then 'numdiff' will understand that both in FILE1 and in FILE2 the character *underscore* ('_') is used in place of the default one ('.') to indicate the position of the decimal point in the numerical values. But if the command is 'numdiff -d_: FILE1 FILE2', then 'numdiff' will understand that the decimal point is indicated by the character *underscore* in FILE1, and by *colon* (':') in FILE2. If you omit to use one of the options '-d', '-t', '-g', '-p', '-n', '-e', and '-i', then the corresponding attribute will take its default value, *note Default Numeric Format::. You should be careful whenever you use one or more of these options. First, not all characters can be passed to them as arguments. The arguments of the option '-g' must be digits, the arguments of the options '-d' and '-t' must be punctuation marks (punctuation marks are all the characters of the ASCII set for which the standard C function 'ispunct' returns a non zero value), those ones of the options '-p', '-n', '-e' and '-i' must be graphical characters but digits (graphical characters are all the characters of the ASCII set for which the standard C function 'isgraph' returns a non zero value). It is not possible to set the decimal point, the thousands separator, the positive sign, the negative sign, the prefix for decimal exponent or the symbol of the imaginary unit in such a way that, for a same file, two or more of these characters come out to be equal. This rule also applies if you miss/omit to explicitly select a symbol through the appropriate option. For instance, the command 'numdiff -d,. FILE1 FILE2' will make 'numdiff' abnormally terminate after printing the error message: The numeric format specified for the first file is illegal, the following symbols should be all different while two or more of them are actually equal: Decimal point = `,' Thousands separator = `,' Leading positive sign = `+' Leading negative sign = `-' Prefix for decimal exponent = `e' Symbol used to denote the imaginary unit = `i' With the option '-d' we have told 'numdiff' that in the first file the decimal point is indicated by the character *comma*, but at the same time we have not modified the character in use to separate the groups of thousands, which has remained the default one, i.e. *comma*, for both files to compare. In this way we have implicitly told that in FILE1 the character *comma* represents both decimal point and thousands separator. Since this is not reasonable, 'numdiff' refuses to work. To avoid this problem it would be sufficient to set explicitly the thousands separator by means of the option '-t': 'numdiff -d,. -t., FILE1 FILE2'. Of course, we assume here that the decimal point and the thousands separator are represented in FILE1 by *comma* and *dot* respectively, in FILE2 by *dot* and *comma*. I strongly suggest you, whenever you write a file, to avoid using the same symbol for two different things (like would be using *comma* for both decimal point and thousands separator), it is nonsense. At last, it is possible (but silly) to specify as argument for the options '-d', '-t', '-g', '-p', '-n', '-e', or '-i' one of the characters used as delimiters in the files to compare. 'numdiff' does not complain, but you have to consider that the program first uses the set of field delimiters to split the files into fields and only afterwards, when it has to distinguish between numerical and non-numerical fields, it takes into account the numeric formats specified for the two files. To prevent conflicts, you should then avoid to specify as argument for the options '-d', '-t', '-g', '-p', '-n', '-e', or '-i' a character which is also used as field delimiter. As a general rule, in writing a file you should avoid using the same symbol to mean two different things. What we have said also explains why the argument of the option '-c' should never contain field delimiters. The option '-X' can be used to restrict the comparison between files to a certain group of fields. This option requires as argument a range of positive integer values or eventually just one positive integer number. The argument indicates the position(s) of the fields that 'numdiff' has to ignore. Remember that the fields of a line are numerated starting from the left hand of the line and proceeding towards the right hand. The argument passed to '-X' can start with a prefix, which must be either '1:' or '2:'. '1:' refers to the file passed as first on the command line, '2:' to the file specified as second. With the prefix '1:' only the fields of the first file corresponding to the specified position(s) are ignored. Similarly, you have to use the prefix '2:' if you want to ignore only fields from the second file. The option '-X' can appear more times on the command line, in which case 'numdiff' will ignore all fields located in the positions so specified. Some examples can clarify the use of ranges and prefixes. If the file 'List1' contains the data * a 1 1 1 1 * b 2 2 2 2 * c 3 3 3 3 * d 4 4 4 4 * e 5 5 5 5 and 'List2' the data 1 1.1 1.01 A 1.001 1.0001 2 2.2 2.02 B 2.002 2.0002 3 3.3 3.03 C 3.003 3.0003 4 4.4 4.04 D 4.004 4.0004 5 5.5 5.05 E 5.005 5.0005 then the output of 'numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2' is ---------------- ##1 #:4 <== 1 ##1 #:2 ==> 1.1 @ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:5 <== 1 ##1 #:3 ==> 1.01 @ Absolute error = 1.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##2 #:4 <== 2 ##2 #:2 ==> 2.2 @ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:5 <== 2 ##2 #:3 ==> 2.02 @ Absolute error = 2.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##3 #:4 <== 3 ##3 #:2 ==> 3.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:5 <== 3 ##3 #:3 ==> 3.03 @ Absolute error = 3.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##4 #:4 <== 4 ##4 #:2 ==> 4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:5 <== 4 ##4 #:3 ==> 4.04 @ Absolute error = 4.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##5 #:4 <== 5 ##5 #:2 ==> 5.5 @ Absolute error = 5.0000000000e-1, Relative error = 1.0000000000e-1 ##5 #:5 <== 5 ##5 #:3 ==> 5.05 @ Absolute error = 5.0000000000e-2, Relative error = 1.0000000000e-2 +++ File "List1" differs from file "List2" Numdiff cuts off from 'List1' the fields in the positions 1, 2 and 6 and from 'List2' the fields in the positions 4, 5 and 6. In this way it compares the third, fourth and fifth field of every line of 'List1' with the first, second and third field respectively of the corresponding line of 'List2'. An equivalent form of the command 'numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2' is given by 'numdiff -X 1:1-2 -X 2:4-5 -X 6 List1 List2' : since the sixth field is cut off from both files, we can refer to it without a prefix. As you can see, you can specify a range of fields by using the notation 'M-N', where M and N are the field numbers of the first and of the last field in the range. It is even possible to use range expressions like 'M-' or '-N'. The first expression corresponds to all fields starting from the Mth one (inclusive) till to the end of line, the second selects all fields from the first one till to the Nth one (inclusive). Therefore the command 'numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2' is equivalent to 'numdiff -X 1:-2 -X 2:4 -X 1:6 -X 2:5- List1 List2' and to 'numdiff -X 1:-2 -X 1:6 -X 2:4- List1 List2'. Mind that, while writing a specification for the option '-X', the largest field number you can use is 32768. If you employ the option '-X' the exit status of 'numdiff' reflects the outcome of the restricted comparison. For instance, the exit status of 'numdiff -X 8- FILE1 FILE2' is 1 only if 'numdiff' has found a difference in the first seven fields of FILE1 and FILE2. If the two files differ only in the fields after the seventh one, then 'numdiff' ends with a zero exit status. Going back to the example with 'List1' and 'List2', the output of 'numdiff -X 1:1-2 -X 1:4- -X 2:2- List1 List2' is +++ Files "List1" and "List2" are equal since every field of 'List1' at position 3 is equal to the first field in the corresponding line of 'List2'. The exit code returned by the program to the shell is in this case zero. The options '-z', '-Z', '-m', '-H', '-f', and '-T' influence the action of the filter and their use is then described later, *note Filtering::. Care that '-z' and '-Z' need both an argument in the same form required by '-X'. Since version 5 Numdiff accepts also long options to conform to the GNU standards. For example, now it is possible to use '--separators='\n\t %'' or '--separators '\n\t %'' instead of using '-s '\n\t %''. The long options, which start all with two dashes, are listed at the beginning of this chapter, each one near to the corresponding short option. The argument of a long option may or may not be preceded by the = sign. The only exceptions are the options '--test-filter' and '--overview', for which the presence of the = before the argument is mandatory. Thus, '--test-filter=60' is correct while '--test-filter 60' is not accepted. ---------- Footnotes ---------- (1) By major numerical differences and major errors I mean those ones listed in the output of 'numdiff' if none of the options '-U', '-f', '-O', and '-q' is used.  File: numdiff.info, Node: ndselect, Next: Invoking ndselect, Prev: Invoking numdiff, Up: Top 6 Selecting lines and fields for the comparison *********************************************** Together with the version 5.x of Numdiff is shipped the program 'ndselect'. Originally, I decided to create this utility in order to deal with a situation that comes out often in Numerical Analysis. Here I present a very simple example of such a situation. Let us suppose that file 'list1' contains the values of the square root, rounded to the 20th decimal digit, for all integer numbers between 12 and 24: 12 3.46410161513775458705 13 3.60555127546398929312 14 3.74165738677394138558 15 3.87298334620741688518 16 4 17 4.12310562561766054982 18 4.24264068711928514641 19 4.35889894354067355224 20 4.47213595499957939282 21 4.58257569495584000659 22 4.69041575982342955457 23 4.7958315233127195416 24 4.89897948556635619639 File LIST2 contains _suitable_ approximations of the square root only for the numbers between 12 and 21 which are multiple of 3: 12 3.46410162002945508100 15 3.87298387096774193548 18 4.24264705882352941176 21 4.58260869565217391304 These approximations could have been obtained by using the famous Heron's algorithm: given an approximation 'a' for the square root of a number 'x', a better approximation is computed by using the formula 'a := 0.5 * (x/a + a)'. What we want now is to understand by means of 'numdiff' how good the approximations contained in file LIST2 are. Unfortunately, we cannot execute directly the command 'numdiff list1 list2', since in this way we would compare the approximations provided for the square roots of 15, 18, and 21 with the square roots of 13, 14, and 15, respectively. To make the comparison in the right way, one could open 'list1' in a text editor and remove from this file all lines but the ones related to the numbers 12, 15, 18, and 21. This approach is practicable since we have to remove only a few lines: one can easily figure out how boring and inefficient would be to manually remove hundreds or thousands of lines from a file. An expert GNU user would suggest that it is possible to automate this removal by using the well known utilities 'head' and 'sed', in this particular case 'head -n 10 list1 | sed -n -e '1~3 p' > List1'. A quick explanation for the ones who do not know how to use 'head' and 'sed': the previous command extracts from 'list1' the first 10 lines, namely the lines containing the square roots of the numbers from 12 to 21, then picks every third line starting from the first one to select only the lines related to 12, 15, 18, and 21. Finally, these lines are printed to the file 'List1', which then looks like: 12 3.46410161513775458705 15 3.87298334620741688518 18 4.24264068711928514641 21 4.58257569495584000659 Once obtained 'List1', we can perform the comparison between the values we are interested in by means of 'numdiff List1 list2' . Unfortunately, this trick only works if you have installed the GNU version of 'sed' which, as far as I know, is the only one providing the extension FIRST~STEP to specify line addresses. This is why I decided to implement 'ndselect', which allows to obtain the same result as above with the simpler command 'ndselect -b 1 -e 10 -s 3 list1 > List1'. The meaning of the arguments passed to the options '-b', '-e', and '-s' is the following: we tell 'ndselect' to print every third line of file 'list1' (the option '-s' specifies the step) starting from the first one (the option '-b' specifies the beginning) and ending within the tenth one possibly inclusive (the option '-e' specifies the end). Because of the presence of the redirection operator '>', the previous command sends to the file 'List1' what 'ndselect' would print to the screen (standard output). Since version 5.6 'ndselect' can also be used to select particular fields of a file. Instead of printing all fields of every line, you may want to print indeed only the fields at particular positions. To do this you can employ the option '-F' to indicate the position of the first field to print, the option '-L' to indicate the position of the last field that can be printed, the option '-I' to set the increment when selecting the fields. In addition, the option '-S' can be used to specify a set of field delimiters different from the default one (which consists of *blank*, *tab* and *newline*). As for 'numdiff', the field delimiters are used to split the input lines into fields. The option '-S' of 'ndselect' recognizes and accepts the same escape sequences of 'numdiff' options '-s', '-D', and '-c'. As example consider the selection of the even fields between the second and the sixth one inclusive from the file 'many_many_columns', whose contents are shown here: A | I | 1.1 | 1.08 | 1.01 | 0.1 | 11.011 | -1.0e-1 B | II | 2.2 | 2.16 | 4.04 | 0.4 | 24.024 | -1.0e-2 C | III | 3.3 | 3.24 | 9.09 | 0.9 | 39.039 | -1.0e-3 D | IV | 4.4 | 4.32 | 16.16 | 1.6 | 416.039 | -1.0e-4 E | V | 5.5 | 5.40 | 25.25 | 2.5 | 525.416 | -1.0e-5 F | # | # | # | # | # | # | # This selection can be accomplished by means of the command 'ndselect -S '| \t\n' -F 2 -L 6 -I 2 many_many_columns', whose output shows only the selected fields: I | 1.08 | 0.1 II | 2.16 | 0.4 III | 3.24 | 0.9 IV | 4.32 | 1.6 V | 5.40 | 2.5 # | # | # Of course, you can also select particular fields of particular lines, as shown by the output of the command 'ndselect -S '| \t\n' -b 1 -e 5 -s 3 -F 2 -L 6 -I 2 many_many_columns': I | 1.08 | 0.1 IV | 4.32 | 1.6 By default, 'ndselect' reuses the delimiters found in the input lines while writing the selected fields to the standard output. You can specify a custom separator by means of the option '-O'. This one recognizes and accepts the same escape sequences of 'numdiff' options '-s', '-D', and '-c'. For example, 'ndselect -S '| \t\n' -b 1 -e 5 -s 3 -F 2 -L 6 -I 2 -O '\t\t' many_many_columns' puts two horizontal tabulations after every printed field: I 1.08 0.1 IV 4.32 1.6 Even if the implementation of a filter in 'numdiff' and the addition of the option '-X' have made 'ndselect' much less useful than in the past, this tool can still be used to handle some special cases. In addition, it can be used as a filter for other programs than 'numdiff'. The complete synopsis of 'ndselect' can be found in the next chapter.  File: numdiff.info, Node: Invoking ndselect, Next: Filtering, Prev: ndselect, Up: Top 7 Invoking ndselect ******************* *SYNOPSIS* ndselect -h|--help|-v|--version or ndselect [-b N][-e N][-s N][-F N][-L N][-I N][-S IFS][-D DELIMS] [-O OSEP][-x][-l PATH][-o PATH][FILE] where FILE is the name of the file to read from. In the first case 'ndselect' prints a short help or/and version number, Copyright, License notice, and NO-Warranty disclaimer. In the second case 'ndselect' prints to the standard output a subset of lines and fields from FILE. The complete path of FILE should be given, a directory name is not accepted. If no input file is specified, the program reads from the standard input. *OPTIONS* '-b, --beginning, --start=N' Set to N the number of the first line to print (The default behavior is to start with line number 1) '-e, --end=N' Set to N the number of the last line that can be printed (The default behavior is to arrive till to the end of the file) '-s, --step=N' Set to N the increment to use when selecting the lines to print (The default value for the increment is 1) '-F, --first-field=N' Set to N the number of the first field to print (The default behavior is to start with field number 1) '-L, --last-field=N' Set to N the number of the last field that can be printed (The default behavior is to arrive till to the end of every line) '-I, --increment=N' Set to N the increment to use when selecting the fields to print (The default value for the increment is 1) '-S, --separators=IFS' Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline) '-D, --delimiters=DELIMS' Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline) '-O, --output-separator=OSEP' Specify the string to use as separator while writing the selected fields to the standard output (The default behavior consists in reusing the delimiters found in the input lines) '-x, --omit-empty-lines' Do not print empty lines '-l, --warnings-to=PATH' Redirect warning and error messages from stderr to the indicated file '-o, --output=PATH' Redirect output from stdout to the indicated file '-h, --help' Show this help message '-v, --version' Show version number, Copyright, Distribution Terms and NO-Warranty Passing 0 as argument to the option '-L' or to '-e' is equivalent to omit this option and leave enabled the default behavior (which consists in scanning till to the end of the line and of the file, respectively). *DIAGNOSTICS* The exit status is 0 in case of normal termination, -1 (255) in case of error. As 'numdiff' does, since version 5 also 'ndselect' accepts long options. Thus, instead of 'ndselect -b 1 -e 10 -s 3 list1 > List1' you can write 'ndselect --start=1 --end=10 --step=3 list1 > List1'. The usage of the option '-D' is the same as for 'numdiff'. The option '-S' corresponds to the option '-s' of 'numdiff'.  File: numdiff.info, Node: Filtering, Next: Warnings, Prev: Invoking ndselect, Up: Top 8 Using the filter of numdiff ***************************** Since version 5 you can activate a filter when launching 'numdiff' to make the program appropriately compare the given files even if they do not have the same structure. Recalling the example of chapter 6, if you run the command 'numdiff -z 2- -V list1 list2' you obtain the following result: ---------------- ##1 <== 12 3.46410161513775458705 ##1 ==> 12 3.46410162002945508100 ##1 #:2 <== 3.46410161513775458705 ##1 #:2 ==> 3.46410162002945508100 Absolute error = 4.8917004940e-9, Relative error = 1.4121122985e-9 ---------------- ##2 <== 13 3.60555127546398929312 ==> ---------------- ##3 <== 14 3.74165738677394138558 ==> ---------------- ##4 <== 15 3.87298334620741688518 ##2 ==> 15 3.87298387096774193548 ##4 #:2 <== 3.87298334620741688518 ##2 #:2 ==> 3.87298387096774193548 Absolute error = 5.2476032505e-7, Relative error = 1.3549253331e-7 ---------------- ##5 <== 16 4 ==> ---------------- ##6 <== 17 4.12310562561766054982 ==> ---------------- ##7 <== 18 4.24264068711928514641 ##3 ==> 18 4.24264705882352941176 ##7 #:2 <== 4.24264068711928514641 ##3 #:2 ==> 4.24264705882352941176 Absolute error = 6.3717042443e-6, Relative error = 1.5018250929e-6 ---------------- ##8 <== 19 4.35889894354067355224 ==> ---------------- ##9 <== 20 4.47213595499957939282 ==> ---------------- ##10 <== 21 4.58257569495584000659 ##4 ==> 21 4.58260869565217391304 ##10 #:2 <== 4.58257569495584000659 ##4 #:2 ==> 4.58260869565217391304 Absolute error = 3.3000696334e-5, Relative error = 7.2013423303e-6 ---------------- ##11 <== 22 4.69041575982342955457 ==> ---------------- ##12 <== 23 4.7958315233127195416 ==> ---------------- ##13 <== 24 4.89897948556635619639 ==> +++ File "list1" differs from file "list2" Numdiff has recognized that the lines of 'list1' with the square roots for the numbers 13, 14, 16, 17, 19, 20, 22, 23, and 24 have been deleted from 'list2'. The numerical comparison has been done by coupling each line of 'list2' with the line of 'list1' which displays the square root for the same integer value. The output obtained running the filter of Numdiff via 'numdiff -f -z 2- list1 list2' confirms this: 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 < 14 3.74165738677394138558 < 15 3.87298334620741688518 15 3.87298387096774193548 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 18 4.24264705882352941176 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 21 4.58260869565217391304 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" If you compare the command 'numdiff -z 2- -V list1 list2' with the one used for the files 'bill1' and 'bill2', *note command::, you surely notice that the filter has been invoked in different ways, first with '-z @' and then with '-z 2-'. The synchronization procedure used by the filter is based on blurring and byte-by-byte comparison. The options '-z' and '-Z' are used to select which fields from which file have to be blurred. They take both an argument in the same form requested by '-X', *note Use of the option -X::, but accept additionally the special value '@' as abbreviation for the range of fields '1-'. Thus, the specifications '1:@', '2:@' and '@' are used to mean all fields of the first file, of the second one or of both, respectively. Employing '-z' and '-Z' in the right way is extremely important to let the filter work as desired. For instance, 'numdiff -f -z @ list1 list2' matches the lines of 'list1' and 'list2' in the same wrong way 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 15 3.87298387096774193548 14 3.74165738677394138558 18 4.24264705882352941176 15 3.87298334620741688518 21 4.58260869565217391304 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 < 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 < 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" as Numdiff would do without employing the filter. It is essential then to understand what blurring a field means and how the filter uses blurring to match the lines of the files to compare. After reading the files the filter removes from each of them (from their images in the memory, actually) all the fields selected by the option '-X', then it replaces each of the fields that have to be blurred by a special character. This special character is the same for both files and it is so chosen that it cannot appear in the text. Blurring a field means to replace it by this sort of place card. After doing this, the filter converts all remaining numerical fields to a standard format and then compares the files byte by byte neglecting the field delimiters. This comparison is just used to establish which lines of the first file are not present in the second, which lines of the second file are missing in the first one, and how to match the remaining lines to create a one-to-one correspondence. Only at this point 'numdiff' inspects each couple of corresponding lines, splits the two lines into the constituent fields, and neglecting those ones eventually specified through the option '-X' compares corresponding fields as it is supposed to do, performing a numerical comparison whenever the fields are both legal numerical values. Blurring the right fields is essential to appropriately match the lines from the two files before doing any numerical comparison. Without blurring, the numerical fields could prevent the filter of 'numdiff' from an appropriate matching of the lines by creating confusion with their (maybe small) numeric differences. Blurring can be of two types, conditional or unconditional. The blurring is conditional if it has to be performed only for fields which turn out to be legal numerical values. The arguments of the option '-z' indicate which fields of which file have to be blurred *under the condition that they are recognized as numeric fields*. Non-numeric fields are left by '-z' untouched (no blurring occurs for them). Then '-z 1:5-7' makes the filter blur the 5th, 6th and 7th field of each line of the first file whenever they are recognized as numeric. By means of the option '-Z' you can specify which fields have to be unconditionally blurred, i.e. independently of their type, numeric or not. For example, '-Z 2:3-4' activates the blurring of the 3th and 4th field of each line of the second file. Going back to the comparison of the files 'list1' and 'list2', the option '-z 2-' of the command 'numdiff -z 2- -V list1 list2' makes the filter transform the (memory copies of the) two files as 12 * 13 * 14 * 15 * 16 * 17 * 18 * 19 * 20 * 21 * 22 * 23 * 24 * and 12 * 15 * 18 * 21 * respectively. Here * denotes the special symbol used by the filter in the blurring procedure, even if this symbol is not actually a bullet. Since in this example space, tab and newline are used as field delimiters, the byte-by-byte comparison between the transformed files produces the same result displayed by the command 'sdiff -W' when applied to them: 12 * 12 * 13 * < 14 * < 15 * 15 * 16 * < 17 * < 18 * 18 * 19 * < 20 * < 21 * 21 * 22 * < 23 * < 24 * < If you put the blurred fields back you obtain exactly the output of 'numdiff -f -z 2- list1 list2', i.e. the outcome of the filtering: 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 < 14 3.74165738677394138558 < 15 3.87298334620741688518 15 3.87298387096774193548 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 18 4.24264705882352941176 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 21 4.58260869565217391304 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" Since the second field is a numerical value in all lines of 'list1' and 'list2', using the option '-Z' instead of '-z' makes no difference in this case. The output of 'numdiff -f -Z 2- list1 list2' is then the same of 'numdiff -f -z 2- list1 list2'. After this explanation you should also understand why 'numdiff -f -z @ list1 list2' gives a wrong result. Since also the first field is always a numerical value, the option '-z @' makes the filter transform the two given files as * * * * * * * * * * * * * * * * * * * * * * * * * * and * * * * * * * * respectively, making then impossible to match the lines in a reasonable way. We consider now a typical situation in which it is better to use '-Z' in place of '-z'. If file 'Table1' contains -6 2.449490 -5 2.236068 -4 2.000000 -3 1.732051 -2 1.414214 -1 1.000000 0 0 - - - - - - - - - 1 1.000000 2 1.414214 3 1.732051 4 2.000000 - - - - - - - - - 5 2.236068 6 2.449490 7 2.645751 - - - - - - - - - 8 2.828427 9 3.000000 10 3.162278 11 3.316625 12 3.464102 - - - - - - - - - - - - - - - - - - 13 3.605551 14 3.741657 and 'Table2' contains -6 Not_defined -4 Not_defined -2 Not_defined 0 0.000000 2 1.414216 4 2.000000 6 2.449494 8 2.828469 10 3.162278 12 3.464102 14 3.741658 ********************END then the output of 'numdiff -z 1:2 -Z 2:2 -f Table1 Table2' is -6 2.449490 -6 Not_defined -5 2.236068 < -4 2.000000 -4 Not_defined -3 1.732051 < -2 1.414214 -2 Not_defined -1 1.000000 < 0 0 0 0.000000 - - - - - - - - - < 1 1.000000 < 2 1.414214 2 1.414216 3 1.732051 < 4 2.000000 4 2.000000 - - - - - - - - - < 5 2.236068 < 6 2.449490 6 2.449494 7 2.645751 < - - - - - - - - - < 8 2.828427 8 2.828469 9 3.000000 < 10 3.162278 10 3.162278 11 3.316625 < 12 3.464102 12 3.464102 - - - - - - - - - < - - - - - - - - - < 13 3.605551 < 14 3.741657 14 3.741658 > ********************END +++ File "Table1" differs from file "Table2" which is exactly what is expected. On the other hand the command 'numdiff -z 2 -f Table1 Table2' displays -6 2.449490 | -6 Not_defined -5 2.236068 | -4 Not_defined -4 2.000000 | -2 Not_defined -3 1.732051 < -2 1.414214 < -1 1.000000 < 0 0 0 0.000000 - - - - - - - - - < 1 1.000000 < 2 1.414214 2 1.414216 3 1.732051 < 4 2.000000 4 2.000000 - - - - - - - - - < 5 2.236068 < 6 2.449490 6 2.449494 7 2.645751 < - - - - - - - - - < 8 2.828427 8 2.828469 9 3.000000 < 10 3.162278 10 3.162278 11 3.316625 < 12 3.464102 12 3.464102 - - - - - - - - - < - - - - - - - - - < 13 3.605551 < 14 3.741657 14 3.741658 > ********************END +++ File "Table1" differs from file "Table2" which is partially wrong. Notice that in 'Table1' you find (truncated to the sixth decimal digit) the square roots of the absolute values of the integer numbers between -6 and 20, plus some randomly added lines. The file 'Table2' contains approximations (obtained by Newton's method) of the square roots of the even numbers between -6 and 20. Since the (real) square root is not defined for negative numbers, the values corresponding to -6, -4 and -2 are replaced by Not_defined. Since Not_defined is not a numeric value, during the execution of the last command the filter transforms 'Table1' in this way -6 * -5 * -4 * -3 * -2 * -1 * 0 * - - - - - - - - - 1 * 2 * 3 * 4 * - - - - - - - - - 5 * 6 * 7 * - - - - - - - - - 8 * 9 * 10 * 11 * 12 * - - - - - - - - - - - - - - - - - - 13 * 14 * and 'Table2' in this other way -6 Not_defined -4 Not_defined -2 Not_defined 0 * 2 * 4 * 6 * 8 * 10 * 12 * 14 * ********************END Unfortunately the first three lines are enough to confuse the synchronization procedure of the filter, which is based on a byte-by-byte comparison with exclusion of the field delimiters, as explained before. You can check that this is definitely the case by looking at the output of the command 'sdiff -W' on the transformed files, which is -6 * | -6 Not_defined -5 * | -4 Not_defined -4 * | -2 Not_defined -3 * < -2 * < -1 * < 0 * 0 * - - - - - - - - - < 1 * < 2 * 2 * 3 * < 4 * 4 * - - - - - - - - - < 5 * < 6 * 6 * 7 * < - - - - - - - - - < 8 * 8 * 9 * < 10 * 10 * 11 * < 12 * 12 * - - - - - - - - - < - - - - - - - - - < 13 * < 14 * 14 * > ********************END If we give the command 'numdiff -z 1:2 -Z 2:2 -f Table1 Table2' instead of 'numdiff -z 2 -f Table1 Table2', the second field of the lines of 'Table2' is always blurred. The filter transforms then 'Table2' into -6 * -4 * -2 * 0 * 2 * 4 * 6 * 8 * 10 * 12 * 14 * ********************END and re-synchronizes the files 'Table1' and 'Table2' in the right way. Using the unconditional blurring is suggested in all cases when a certain field, which you want to include in the comparison (use '-X' to completely neglect one or more fields), is of numeric type in almost all lines of (one of) the given files. This can be for instance the case when in some lines the contents of the field are given by a special numeric value, like Infinity, Inf, +Inf or -Inf, or by NaN, abbreviation for Not a Number. Concerning the numeric fields which are not blurred, it is worth remarking that the filter is not confused by differences in the numeric format. Before the byte-by-byte comparison, numeric values are converted indeed to a standard format. To offer an example of this, let us suppose that 'short1' contains a list of numbers with their logarithms 0.001 -3 0.01 -2 0.1 -1 1 0 1000 3 1000000 6 1000000000 9 and 'short2' the same list of numbers and logarithms, but with differences in the numeric format: ****************** 0.0010000 -3 .0100 -2 0000.10 -1 1. 0 1,000.000 3 1,000,000. 6 1,000,000,000 9 Then 'numdiff -f -z 2- short1 short2' displays > ****************** 0.001 -3 0.0010000 -3 0.01 -2 .0100 -2 0.1 -1 0000.10 -1 1 0 1. 0 1000 3 1,000.000 3 1000000 6 1,000,000. 6 1000000000 9 1,000,000,000 9 +++ File "short1" differs from file "short2" showing that the filter has matched the lines in the right way. The filter can even handle the case when the same numerical value is written in decimal notation in one file and in scientific notation in the other one. If the files 'decimal' and 'scientific' contain .001 -3 .01 -2 .1 -1 * * * * * * * * * 1 0 1000 3 1000000 6 1000000000 9 and ***************** 1.0e-3 -3 1.0e-2 -2 1.0e-1 -1 1.0e0 0 1.0e3 3 1.0e6 6 1.0e9 9 ***************** respectively, then 'numdiff -f -z 2- decimal scientific' prints > ***************** .001 -3 1.0e-3 -3 .01 -2 1.0e-2 -2 .1 -1 1.0e-1 -1 * * * * * * * * * < 1 0 1.0e0 0 1000 3 1.0e3 3 1000000 6 1.0e6 6 1000000000 9 1.0e9 9 > ***************** +++ File "decimal" differs from file "scientific" proving that the filter does not get confused. No problems arise also in the case when for the same field the scientific notation is used in both files. If the files 'sc1' and 'sc2' contain 1.E-3 -3 1.00E-2 -2 1.0E-1 -1 1.0000E0 0 001.0E3 3 +01.000E6 6 1.0E+09 9 1.0E+10 10 * * * * * * * * * * and ***************** 1.0e-003 -3 1.0e-2 -2 1.0e-1 -1 1.0e0 0 +1.0e3 3 1.0e+6 6 1.0e9 9 respectively, then 'numdiff -f -z 2- sc1 sc2' correctly displays > ***************** 1.E-3 -3 1.0e-003 -3 1.00E-2 -2 1.0e-2 -2 1.0E-1 -1 1.0e-1 -1 1.0000E0 0 1.0e0 0 001.0E3 3 +1.0e3 3 +01.000E6 6 1.0e+6 6 1.0E+09 9 1.0e9 9 1.0E+10 10 < * * * * * * * * * * < +++ File "sc1" differs from file "sc2" The filter can even handle an improper use of the scientific notation, meaning for example that it can recognize '123.456E+2' and '1.23456E+4' as equal. We can see this in the case of the files 'Scnot1': ------------------------- 1.2E0 * 1 2.45E-1 * 2 -3.678E-2 * 3 and 'Scnot2': 12E-1 * 1 245E-3 * 2 -0.003678E+1 * 3 'numdiff -f -z 3- Scnot1 Scnot2' displays the report: ------------------------- < 1.2E0 * 1 12E-1 * 1 2.45E-1 * 2 245E-3 * 2 -3.678E-2 * 3 -0.003678E+1 * 3 +++ File "Scnot1" differs from file "Scnot2" which is exactly what you would expect in such a case. Also pretty hard cases do not confuse the filter. If 'Scnot1' is given by 1.2000e0 * 1 02.4500e-1 * 2 -003.678E-2 * 3 and 'Scnot2' is the same file as before, the output of the command 'numdiff -f -z 3- Scnot1 Scnot2' is still right: 1.2000e0 * 1 12E-1 * 1 02.4500e-1 * 2 245E-3 * 2 -003.678E-2 * 3 -0.003678E+1 * 3 +++ Files "Scnot1" and "Scnot2" have the same structure In all examples above the option '-f' is used with no argument. However, '-f' accepts an optional argument, which can be used to control how '-f' displays its output. If you provide an argument, care not to leave any space between the option and the argument: '-f60' is correct while '-f 60' makes Numdiff terminate after printing an error message. If the argument is a positive number NUM, then the side-by-side output produced by '-f' will be NUM columns wide. The default value for the width of the output is 130, which can fit onto a traditional printer line, and is the one used when '-f' has no argument, or the supplied argument is zero. In other words, '-f' and '-f0' are just easier to remind versions of '-f130'. A negative argument has the same effect as the positive argument with the same absolute value, but it causes in addition the removal of common lines from the output. For example, the command 'numdiff -z 1:2 -Z 2:2 -f-130 Table1 Table2' displays the following text -5 2.236068 < -3 1.732051 < -1 1.000000 < - - - - - - - - - < 1 1.000000 < 3 1.732051 < - - - - - - - - - < 5 2.236068 < 7 2.645751 < - - - - - - - - - < 9 3.000000 < 11 3.316625 < - - - - - - - - - < - - - - - - - - - < 13 3.605551 < > ********************END +++ File "Table1" differs from file "Table2" In conjunction with the option '-f' or '-O' you can use '-T' to expand tabs to spaces in the produced output. This is useful to preserve the alignment of tabs in the input files, if it is thrown off by the presence of the gutter. The options '-H' and '-m' affect the performance of the filter of Numdiff. But performance has more than one dimension and these options improve one aspect of performance at the cost of another, or they improve performance in some cases while hurting it in others. The re-synchronization of the two compared files made by the filter always comes up with a near-minimal set of deletions/insertions of lines, that usually is good enough for practical purposes. If the filter displays a large set of line deletions/insertions, you might want it to use a modified algorithm that sometimes produces a smaller set of differences. The '-m' option does this; however, it can also cause the filter to run more slowly than usual, so it is not the default behavior. If the files you are comparing are large and have small groups of changes scattered throughout them, you can use the '-H' option to make a different modification to the algorithm employed by the filter. If the input files have a constant small density of changes, where change means here deletion/insertion of lines, this option speeds up the comparison without changing the output or in the worst case introducing minor modifications.  File: numdiff.info, Node: Warnings, Next: Index, Prev: Filtering, Up: Top 9 Warnings ********** * Bug reports have to be sent to the address . Please, put Numdiff in the subject and indicate the version of the operating system you are running (in particular, do not forget to specify if it is a 32- or a 64-bit system), and, if you know it, the version of the compiler used to build Numdiff. Please write also whether your version of Numdiff uses the GNU MP library or not. Before writing an email be sure to run the latest stable version of Numdiff, I do not provide support for older versions. * Numdiff does not accept numbers in scientific notation whose exponents lie outside the range -1073741824, ..., +1073741824. If such a number is found in any of the files to compare, the execution of the program is stopped after printing a suitable error message on stderr. Under the assumption that the numeric format in use is the default one, with "1.0001e-2147483640" the displayed error messages is numdiff: A number with a too small exponent has been found, namely "1.0001e-2147483640". Exponents smaller than -1073741824 are not accepted, the execution of the program ends now * If Numdiff has been built with its own internal support for multiple precision arithmetic instead of being linked against the GNU MP Library, then performance degradation and memory exhaustion can already make impossible to handle exponents of magnitude 10^6 = 1000000. This is what I obtained on my laptop, equipped with a dual core processor @1.50 GHz and with 1GB of RAM, when I tried to compare the numbers 1.101e1000000000 and 1.0e1000000000: numdiff: Insufficient memory for new allocation, the execution of the program ends now In addition, you can overload the processor with numbers whose exponents lie outside the range -1000000, ..., 1000000. But at least on my machine, everything works fine and quick enough as long as exponent and size of the mantissa of the numbers are in the range -1000, ..., 1000. Be careful and remember that Numdiff is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Consider also that, if you have numeric data with exponents outside the range -300, ..., 300, probably there is something wrong with your data: either you are using the wrong scale, or you should replace very small numbers, like 1e-100, by zero, or it is quite likely that the machine/program/algorithm which produced these data is not working right. * If Numdiff has been linked against the GNU Multiple Precision Arithmetic Library (also called GNU MP), then the precision it uses is typically higher than the specified one. On my machine the actual value of the precision is 20 if the user gives a value between 0 and 20, 30 if the user specifies a precision between 21 and 30, 40 for a user-specified value between 31 and 40, and so on. Anyway, the actual precision is never less than the one required by the user. * After reading a numeric field, Numdiff truncates its value if this number has too much digits with respect to the current precision. To be precise, denoted by P the current value of the precision, the following rules apply. If 'numdiff' has been built with its own internal support for multiple precision arithmetic, then * if the number is written in ordinary decimal notation, 'numdiff' will consider, in addition to all digits of the integer part, only the first P digits of the fractional part; * if the value is written in scientific notation, then 'numdiff' will only consider the first P digits of the fractional part of the mantissa. If 'numdiff' uses the GNU MP library to perform its computations, the value of a numeric field is first translated into scientific notation and then only the first P digits of the fractional part of the mantissa are considered. By current value of the precision I mean the integer value specified by the option '-#', or the default one (35) when this option is not in use. * You can find out whether your local version of 'numdiff' is relying on GNU MP or not by executing the command 'numdiff -v'. If 'numdiff' uses GNU MP, then this command will display the following message or similar (possibly translated into your mother language) among other information: The software has been linked against the GNU Multiple Precision Arithmetic Library, version number 4.2.4. If 'numdiff' does not rely on GNU MP, then the displayed message will be (up to translation into your mother language) The software has been built with its own internal support for multiple precision arithmetic. * Numdiff can only be used on text files: the program terminates after printing a suitable error message if one of the files to compare turns out to be a binary file. To detect if a file is binary or not, 'numdiff' checks for the presence of null bytes (0x00) in the file. * If you are not including the so called white-space characters (usually ' ', '\t', '\f', '\v' and '\r') in the set of field delimiters, then a real and an imaginary number which are separated just by white-spaces can be coupled together and considered as a whole complex number. For example, if you are using only *colon* (':') and *newline* as field delimiters and Numdiff finds a line like that ::::3.0-5.6e-356i::::-12.9 +4.34i::::-12.9 4.34i::::New York:::: then it will consider this line as formed by four fields, the first two are numeric and given by the complex numbers 3.0-5.6e-356i and -12.9+4.34i, the last two ones are the strings New York and -12.9 4.34i. I still do not know if I will modify this in the next version of Numdiff, so that the program recognizes only 3.0-5.6e-356i as numeric field and treats -12.9 +4.34i as non-numeric due to the presence of spaces in the middle. -12.9 4.34i is already considered as non-numeric due to the absence of a leading sign in the imaginary value. * We have seen that one of the two files passed to 'numdiff' can be -, which refers to stdin (standard input). In this way one of the two files to compare can be the output produced by another command, like in 'cat file2 | numdiff -a 1.0e-3 file1 -'. However, if you activate the filter by means of the options '-z' or/and '-Z', Numdiff can not work with the standard input unless you use also the option '-f'. Therefore, the command 'cat file2 | numdiff -a 1.0e-3 -z @ file1 -' displays only the error message numdiff: -: Illegal seek (or maybe the translation of this message in the language you are using on your computer) but 'cat file2 | numdiff -a 1.0e-3 -z @ -f file1 -' works as expected. * This manual describes the version 5.9 of Numdiff. Prior 5.x versions did not recognize all the options that are currently accepted, versions 4.0.0 and 3.x used even a different format for the output.  File: numdiff.info, Node: GNU Free Documentation License, Up: Top Appendix A GNU Free Documentation License ***************************************** Version 1.3, 3 November 2008 Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The "publisher" means any person or entity that distributes copies of the Document to the public. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements." 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See . Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING "Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. "Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents ==================================================== To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (C) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.  File: numdiff.info, Node: Index, Prev: Warnings, Up: Top Index ***** [index] * Menu: * Acknowledgments: Acknowledgments. (line 6) * Build: Installing. (line 6) * Caveats: Warnings. (line 6) * Command line options for ndselect: Invoking ndselect. (line 6) * Command line options for numdiff: Invoking numdiff. (line 6) * Compile: Installing. (line 6) * Copying Conditions: Copying. (line 6) * Diagnostics (ndselect): Invoking ndselect. (line 6) * Diagnostics (numdiff): Invoking numdiff. (line 6) * FDL: GNU Free Documentation License. (line 6) * Filter: Filtering. (line 6) * Filter output (numdiff): Filter output. (line 6) * Format of the reports: Output format. (line 6) * GNU FDL: GNU Free Documentation License. (line 6) * GNU Free Documentation License: GNU Free Documentation License. (line 6) * GNU General Public License: Copying. (line 6) * GPL: Copying. (line 6) * How to use numdiff: Overview. (line 6) * Install: Installing. (line 6) * Introduction: Overview. (line 6) * Invoking ndselect: Invoking ndselect. (line 6) * Invoking numdiff: Invoking numdiff. (line 6) * License: Copying. (line 6) * ndselect (introduction to its use): ndselect. (line 6) * Notes: Warnings. (line 6) * Options, command line (ndselect): Invoking ndselect. (line 6) * Options, command line (numdiff): Invoking numdiff. (line 6) * Output format (numdiff): Output format. (line 6) * Overview mode of numdiff: Overview mode. (line 6) * Predefined settings of numdiff: Invoking numdiff. (line 6) * Purposes: Overview. (line 6) * Raw output format: Raw output. (line 6) * Side-by-side report (numdiff): Overview mode. (line 6) * Synopsis (ndselect): Invoking ndselect. (line 6) * Synopsis (numdiff): Invoking numdiff. (line 6) * Thanks: Acknowledgments. (line 6) * Tools: ndselect. (line 6) * Usage of numdiff: Overview. (line 6) * Warnings: Warnings. (line 6)  Tag Table: Node: Top1043 Node: Copying2616 Node: Acknowledgments3352 Node: Overview4146 Ref: command15741 Node: Output format26426 Node: Overview mode33549 Node: Filter output42092 Node: Raw output43999 Node: Installing45163 Node: Invoking numdiff50397 Ref: Default Numeric Format59096 Ref: Alternative formulas for the computation of the relative difference81576 Ref: Restriction of the comparison to particular fields115180 Ref: Use of the option -X115281 Ref: Invoking numdiff-Footnote-1121064 Node: ndselect121231 Node: Invoking ndselect127941 Node: Filtering131165 Ref: Use of the option -f154213 Node: Warnings157250 Ref: with GNU MP is better158594 Node: GNU Free Documentation License164771 Node: Index189884  End Tag Table numdiff-5.9.0/docs/numdiff.info.gz0000644000175000017500000014430113054341114016354 0ustar paologpaolog‹ã½±Xì[koÛF—þ¼ó'vÞ´€ã„ft±lÇÛu¤u77ÄNƒ 5’¸¦H-‡´¢þú}Ι G”d'/ú±BKâÌ™3çúœ3£›y¦%þÍb’M§qVLËH.«rÒ¤j"Çk¹Hn}+ïT¥³²£x §U¹ðsê/Y,ÄŸâ8nЉœ¨JªlV¨Bþw•LkšXWI£ðL×xRãq*“¿(Îs•ÎñÝbYVÿzô§↘Z$E“ä ¦Ó*+-çåJÖ¥Ì ]'y.k´’ï ‘LˆíY•,äjž¥s‘–‹eRaⲩ“:»SùZêl‘åI%§YŽyV(Ú"ÿ%zÓLå¼i~ 좬²b&õ‚–ĆU•¥’ÖS•*RÐ(«g4Ó}UûAÓ²Z$µ†d¤”—år]e3lóñå¡ôz£ˆþ?áÿOùÿ3þÿ9ýßïñÿ}þÀÿ#ÿù=ÏíóÜþ©¼ºKŠR~¨°3ùCv·¤7“ú0‡Ðªòñ¤¬³ús!åU-2Íj„ˆ!¬¢†–!Õ FØ…®!ì¦fq<++¹(±³µ¬¡CaR¦Ø ö UCÑõ\ÉD!ˆ)øåÝ'ùºRJ¾´!z¬ö&KU¡UdˆünM©!@¬$ ãmlÙŒóLÏY&y]NëTjˆ¼.ÁSÿ/¹Ê깄®Š»¤Ê°+y­Rz¤#úúuUõÑe òòF}©ñ-ögÈàñÏIz>¥¼`‰¸Må†{’YV¤y3c0á'EY[fîßöùy,®Þ½~ôòêãÑõ«Ë›«÷ïx)™VÊŒ$#‚ÉgË&ç/ÄõÍÅÇ›#?ëÕ»›ˆ'ÎÜÏåcë~‡1™™:ª1ìÛM²‚¾ðæH­åcZl˲ÈׇâÕ»—Ý%ÄŠ× rÞ ò]9Á—7å’Þƒõs6j,Ï*uŽ&YuˆOŸ–ö½–[ùIC¶o٣œí×?ÑãŸèñOô¸/zÀóߪ¢9§7ÖïÎÏå®—s9; ‹IÆ›‘ùðæ.ÒÛ¢\åj2£µt‡Pç)Æ¿ÇÞî2µÚ½âUQ3\`–a 6n`Þ•q¶=¼þºé‘á´»òÖÆ.Žuç;¦‘ó¶SЉVõn}¨ôãbh˜þÒ*俺u`½ÁÁ.º!ö9æ hÂ÷é%˜C&1åÁd í>'Eì®:ìëwXfÙhY)D&(ÆØ.1ûñHyaJ†J[#§ôþÈ{ž¨/{lÊd˜\Á³3ö@’hƒI‹ò Ã$Jx'DßMAbpæü8Éu)WUV×H ^¡ØÃ”ö®­sŸËuÙÈ4) ¨ eµØ IÙ½!èU¨ éã’Ô‰R&ZÜZ‚¨!Máy”†vá‚Å.„Zb–°¤I‡ÛÁÌd'R™ßGâa^.ɬ@ ÛZep¦±"S›6y$1R|¾ºùõý§yñîùùâãÇ‹w7˜°W6ÈwÊÐÉ ã d±ŠíÀÄÛW/Åø‹Ÿ¯Þ\ÝüAL¿¾ºy÷êúZ¾~ÿ‘î`ÊÕå§7å‡O?¼¿~EÎ¥º²YNYÙDªä6Óýåi0…<:OîY»Bî =‡u¿ŽD’—0nŽèlá6«#(_M øDRƒ¹æu½<ölµZų¢‰ËjöÌzˆ~ö"~À¾·íÙØ¹‹“ÞÀ[GðF>ØŽ¯Ûhè *@BÀ€V‹[ù¶Šim@‚B^æŠÿþp±à].÷(iO¡sþ¦Põ ’°ÐÐ- I7³™Ò& @~3’íBqø]@BwF]À¢“dœåTOñ¬U™¤„$½Àj‹6ÊDk¡àóW8 ùê²Ì`° I…2`¬L1H\Ä·€Zë"#Õf)›6).U½RdŸ«RÜ£OXxI&&µ‘UNˆÍû)À­’ξ˜ ©ßXT]Šv#çÙ‚À7æ³)Ò‚M5c‘,+Eп³^¨åqü…e2Â_¸…Û.[í[¬Ca5’]Å-« ÑZýZ,³D~€‰.ÆI{ÒÀˆ]s¥%Ù¹.¡UUe¥ ˆæ¤2)±)qTºö1…Õ„ñˆ¢(óR^&0{iRéLkÅCvF@dÚ6mú&¥[ý:msl’G×yFàÆ%ZàbÛ{¼s =º%Ÿ†ìö]‘R ˜"É2…)XÆ}kPþª´ÝÀê˜ëUzÓëÇëšó<ï7],ÛÝL‰û×!$úËQ¹Hä{=0aÚ>}f1ÃZ)@,M| D‘¹$Å Ö qFÎÃ@Âé„ÐG‰Æ¤„µ‹ìBÁ¢`TÃá…jÄ‚|¼©à£ê`oHV³²œ˜GµÁ=V݆iÕÔ‚t~ƒà a}.IO䔨*j}×¶¦£LL˜ª¬@N "[ÍM9ãAP9æÈÔè† RÖ(Ÿ<²è’t!E£Èåzé3}|Õ;v¥+·m i´‹ B§¹ì¹ÔÛ $½Ì“ÔC„,d&*ÍØ»i˜‡O»²*Â¥2NU¦Q‘R²Çdn³°FPV¦·Ä‹·J¼wÄa,O®eûy0.ma‡•N‚ˆGõœú)ó¦˜@Ãb‘¡t "¦;7­×Gä4„ëtâÐN™ÚÙ!ˆóë#}(BiñÒ.ø8ÿ¦ìZÈ+T%«Ÿ7Dñ öˆ{£A ·ˆŽO¾w‘¢Æš7Ưx÷DVÑÄ#LŒ1‘J‡)‰§¢¦u—*qÚ™ÐúAëŠ-®BVkAUÅ;7l˜·":a¨ãdlÂ/¡ÀÍ(m„pco]Sž&\Zg d‡VÛ«LÏ“çÞÑ& ÛŠD$YîÊ$œƒax%{¹ú’*ÓÚ±–”7Ï'œZ„E€„4¢€Ó¬bãßÄVÔÈsùˆÏ\¼lÑБ´SÛvZ.¹ÖIev¿ÁAb[¸qÔØ”–Ǻ̩ãÈ[wñlF§|ƒ`B=2„¾  µ9~çþÉŸ¡Ø‡&r‡4¿÷\¶ÑÅ8x 0R’»·1£ßfa‘ðuë¶¼±ÃÖ\‚3íÅI —#®Mɸ6džêÉl¨H4˜!‘»ôÁx«•ÏS¥¦˜°š¯å±Évc µ}{ ‡BÐJxéÚ[„Ì A-« šÉ×í;@ÅžBØãBZØcäîy€^Â@,8:^üåÛ(È5ª¹g¦rìDþËŸT@.@_'y ĸ$V?÷(ê5–¶Å&`ÄW—en ä+£ÛÚJŒ5ôCËø˜O8©þÉ×ÏpÙpk>wkN¹°¦iõðö Ó“ÅEN‘¬åªÝºŸµÓ†ƒõZ,AŽuCMî:)hDOª¸¯Ô²0O¸Ãz<4µ;R§UR#œÙ° Z„S¦El0H¤ÑÔG§ÿåþ:ea|ȳqÜɄܑLÚÞç×–/Ž.(ŽâS¸{S™ò»ðÒ™”.ô´Û±àÓy“³Â‡žCgùՇ΢UB÷Ð9d°†šŽ u'’º¬H›³ÆöîU%õÜ·†ÛbªÝ[Rd«S½„ZßQ ‚Ž¥é WÏšn ?°¡²nÅ0„+jƒŸ\!a$àÊçJG‚ƒ¹-T)–YáÐ`óÑ”qÓN}àFì¨'¼Y¶¥ äô™¢×ŸÃÿ”2KŠ$ÊPV[EÐ-è¨"p$Ú*ž¾uaÄ aCˆ–²‡Ô¾‡µÉ¤YÇl¨eW„•T€ ÔzÖ°WŒvÝg×¹—õÜñE ¸b‰ud¿.S0IlÎ[^¯lÌ(aâÕ¹0á…-dP#í-UE&©Ãü`/fd8}!CŠLð„px85'«à欛 ‰‰Mž þSÁ4^q h‚€;mØEȘ»Ûíh˜¼Ê©XfÓ6GíÉ!ëÁ55…'ß Ú\·•S°wR„;ÀÓK$A`~±«‡ɯä1«v¢%Â0©ªOo3öЄš¦øóHNf°waxY³Üwû'_*dkíž/hª¦ñ÷åA$ºÌnê4Z‘óyãþ§@⹸¾¼ºó{_z‡‘œ#2þE™=ѱ½hEÃk7\ºáÏMúçtŒóø@tG z‡»`¤‹)p·@ÿÀa ÛKêD œñ™;\ï£(§×`ø[©çMÒ»ãÑ(8†:|zœý‡û´"P)&åÌ~>F1U“ô‚wnáb<>9=SGÏù3ÂÑÑI<ªA&„H\œ`Æ»{9éÛ½^À6#Pð¾ƒ[`Ù3)/-·O»lºÑ–Qzÿý÷ß‹ †xš„ð yóàʹƒ³%6ɾ´Û³åçörÓQçe¾ýeà»sz÷Ã?J§¾Ý#~üñ…¼Øñ“üw^?ý´Mh9p†²{qÀ ù»—ÙåÙ w?¦µm[.\UÄ'›òGÙçƼÔÑq$?ªœ1Ø1ÚZíʼneÆ8Aç±yÇÁ }ªvÙı P€Š¢Ê×fd Ádò¯ûmbà÷<°\x×Û=„ÄÚû^Á<{ƒ‡sÒN†Cutº½ž3øÿî‡ÄÌeò7gKÚYÇf\Ù9ŒÅ±1b‡(FÚÈ„5:9ôφ½¢0/°´Å1A‘Ä®Ï2Ø´þ¿m!Ã}< =>X´‘,deø÷°²“‰cû9ˆ OŸ>¥š`9´©”B¯1=ÎLR(¬)°¢°¶Í¬i™ç%_`0z[(­“bu!t=Áw熃'OžHùª˜Ì0RÑA/]Kâ¦F]­m!@×U Ô9ŽƒÍ¾œÊÅöˆ‘[H< &R$f_ìQŸ˜—Ù-„+>êAµ L[©ERÝšº¹l³ÄkOLüÅõB#a[ °j±¢kWºS @G™<g|ãõÝ¥Uõ¥®À û\$Çþ¸P£D”O‰Î‘|Ì_¬ã(0® ÝìFf‹df:ÆM‘ûÙš5¸ÜHÝd€T¹ÚA#sÕuǽNº»þÒ@H xX)è»¶AÔ‘šä›~¾±É}:2º‚Ê;*TɾÌ] “Ó=6×h_0ç[AÉr™QOÁ"kª,Àãù!«ûsÛj“Äû iñ›V+Üse®š»Î€Q~pµIì¼Ú$¿ñj“ظÚt^T ÚðÁ’/W\Ó‡;;|EƒDMgÉ÷”í-´F¸È&“\™ë f ÌØÉM6)6¤·.XýòM¬öPo.jѧÓ(C—ÛžëºGæˆÔª·u-æõƒyæ5——înWb<™]ÅÞ5áêUMðFÕ(ÈÖUÈl·À®‘p@ÞTMþ’ÏV•ê.Ñ 1jñ°µ?a[à£&DË3éð ©´mÑ`™Ò ×Ö`ÌAÚÕh¦mflôq¥¼æŽ«ÿÅ–9“(òu6Εoú“±™[ tÅ/¡‹ûîJž1hht¬MÜrîY{l/éÄ»®2¹.GÕÐý/s7Ëß}¾}4¯Œó=s 6±÷CÕ„‹Lx¶q„Âþ CØՋนïqNâ–¦¹®kNç­³hnëÚ^/~û-·©Ì™ðF­ú—üéÀt:Æà¹ÏrÁïQ[Ü)ŸoáGó6ϼBÞ¦‹¦¢›±ƒÔý[Rô‚úç{*±†1Aú×jÜyr6êŧ@?o“ªóõ 1!/–Ý'£Á1àÍYw眞ÅÌù­Ùæ Çs~kòΓããaÜÇ“‹fÖ¥vrŸ€ÚµZnñf¨½Oëî:½~|Œ9ïʻΓ¾óR¥[szñàô‰Þ”Tö‡sÏOúñI _±_I;Uá„·-ðáƒbÝ'¼ý"Ú/ðÖïmÈùÛfžøîJ¤»‚C¢í „Å©î&vÍ&ª›…˜`{¥íNÅgyô»d‹’–áÇö8v§&bînWø˜þ;+ŒCPœÄM*4·¦‚{©&§¶¸Ä§C‹Ý€ÛÕj¡/=Ôyrå*÷öú³Ü|qIw/Ùa@öž<³Éªû#áVqtªvQÛèSq £×ŽÀq|ôú;zýøìlxvv<œœ©£áý[wu/o}"ýV‰ŽB²û³ð¦ŒX¢{3H—t+ÑÄZÚ´Wž£ä uNF§ÃÓÞH î߸kùòÆ÷ƒŒo•çYHv?ùV².Sn÷B•o&;ÈîG3ßLö8 »ðt$æÜt7(è’n[ÚL¿K¬íg3Å¿©›ì×ö!bçN‚ÑëÝgÒƒøôÁ1µ#î í+è–9a~…ÎNüd¹pºÁ}OvÇ`É:¤¹í&„KbŸä:O‡#õt¸Sr§ƒ~ÿlx|<8SO{Û­BN¯;[…œrM—ìÍæoQ&™F!·VþÒÚJñoò¨L@¤­ðÝQ½9™21’íù-ß%o{Ú×Ô E~h<”G5ñœû{nÊú°9 Ÿê×=µñÕ\©ç9t«ï9zC­Î!bÔŽ÷ÚñA;Ä ªÀô-‘²7 ¯bPoÞ&÷jýµJ§½œ†~B`7V©‡a‚ÍúÄ‘ãRÃ]ª¹ÿýž`™‚qÄæÀ#ÃJC´ja…s4l¸ý–„7±ýÁ*™f)vŸe~» óDâbô8|ý’C…É„­/¬Ž÷¬zdù%{! YÅ-ÞdÅ,M ÞÊ’´0Ïi Š´òù •½ÕÊœÖÕÿØ<P$Ä?ÆùSuÛ Wý³â3(uÕKËȯôÒn¤ œâæ43Ytµ‚á×Ð$¶øixþ±Zã ;è÷X€þbP+(îîíõÇÃÑ^úEÿ“iáž«:n6«†O»UÇö뿦U¿ÿT«î—U¯Ÿ‰[u6 Sç•Uß7Â÷x°jÕ!_h02³7<ñ[jZõ2RÈÃD`šLÖU#…¬º:Ìá×HL ÅO³êk $þ×з˜Û©ó ɰ7¯Zõaw4ìííï{kÏúGXHÜøêî€ði·êØ~ý×Ð$¶øiVÝ5.«^?­Œ®¢0ãnßúêWÝbͪïs÷|Ö›|1þøꮖði}Öïݪû_C“Øâ§Yu׸¬zíDÔ¢¯^usöÇnMkVÝìéØ<²hMÚY³êa¶ûX‹•o’Bnºœÿƒ,V¾EЏiÝL6¶X u`[í²÷}3íêe—Uæeor/úc^£>­—}æ–Ýÿzu“Ÿd+l‡_IÜeãí4=ÉñЗú¶ä:¢ûŒâ‘zoØJýÌÌ·Ÿjj}5µf§´ÿð†FLk£”I+ž~m›üD†gÏ>Š‚BÝD>Æ|ÚÛ?®6Ÿê'ÖøRîF «á“| Ö‡O‰I5ìYv›ã'©õJü¤™ÆºJjº&ðt­59vHx6ÁknÊ¢»)²Í†±:ÃJ´ÙÓ`ßàHLúšÏ(â­lÎX•O}Dߢ­²V!D2x2”YôägUkF×¢É*Ü^Ú‡ë佨.à™Hr±´I_Æ)QÀ£$˜Ó#R›ÙS¶€À±XÎ)‚@ÅBá:@^¾Yë !T@caM‚ðD!bcá<,4ÿÏïuS~¤ÙéhÆ:{ zô/}¾Ø†š¢wÜ'á=uwÒþ¡É}4ì'«Í̪®×I“fæ&²ÒªÜ¨cԋĪ“U2s£pçuÒ$ŠØOVË*üÐ뤉?ÙOV3°FBëuÒ¤ØOš´ðO“÷û9^!ÿ⯫OçªBvQ÷‡ÅˆFw¥|°‚»y5'×A¾ä5_f†²F”àšjP¸Ò†åzØ.È0°s˜BîÒ5›²ÅWË´°Æsš´ÊÉ:Ä0¶É÷íhAKÝÈ[|£;üvá"t1߀PB"/,¼H)—|yKÑЉ|å¥ `&%xp(A4·#Ž6Ƹâ ã)Ö˜ÜwÁ¹ÄÐî‹ô:Ÿç$Sð4 C„ûöþa>‰×$¨Z|ÓJ–<õ+ïÓz8 ‹› +¹Û&:À’ÆHþkrþàM!,2DÛ°Áß CÝê\:WðfŒÚÄ›bã·mPõÑ&°ˆl®8³Ï” rØßNΈg‚Ö‚Â Þ„$áÈí‹{O`ˆÒ²É?†©0LY?;X… ŠwÇá-PN'¯Ì- —mƒ¡¸¨¯ ߃òß å…ñ©,Ö2!ÓÞLŸ¶·˜‰ÇйD0w3°ؓ̃ÓUÒN •·å-A²Ñù/ÒÙeG‚àó…¹R‚µ(n!ÖÇM‡º@âuïð•1¹&¹t^Ä­Ró/i<ä¬Wàb>w¹%à„"-é¦÷¢œBƒ2¢RÕÄ1Q³DsÒ”øvS²„ùz€ai±Õy‚!¥Xš:¤ÿƒ•Á™6^'wÕbÂê7Ë\«\OÛf4†Ê²Ìoð*š#”o®nª‚‹Â¸·ð62¢ÿ^ô8üEÏ)[åÊœˆ„P·”‹0,8Éá/…‘Põ©öRÉõ*"A`¢Ä÷­Ï?ßÈD§Iî½ùþh‹–P¥ýFd½tÓë$&·É£Ôé?G(Ìj·Þ†»ìé¡myˆÊxäeÕj`›æicIM#2ú-œ‹¼ÅbTJ¢&=#Õ U<8%jöÀ¸aà)á¤CxøXØbßf’ý›âm¶nˬûÆzn™õÝÏÈÓï3@#%=ÃâI·.FøŸ‹‡Ûª/i]g7ÖŽVv6R¤–tKv+ØeJïcãA¥À¸LKV¡k{ëU T|ÀãàaGÁ©` ‘qˆ…Q¥zzòJ±OüuÛEM>rçkǃ\.Õ{‘ [‡ÐíÂîé0£]2‚vãñŠã±ã±ÙïÓô `]$TŒ7E¾•˜îI{7ï¿»º2 ·yh]}7oTo©Ò[‚µ47Ô[2ÐH—³$~wüøçy¿3üüN“Ì`æï^¿³‹nˆ-)8»æcsr{ïÀìó±ÃD"×òƒ§óËwñ¶Q©³yVÞïÐæA5Û6¶!o#í&§0v][õü(¾ÉæÛf?·ãŸÍDv„' 6@ .&¼~f—ÞUš54(/ÙAf¾Ìn–<,}¾Äà\ ¥éëÁ;sæ¾ãñ"¥3”Y©bÅ岬Êj½;ÞžŒøÑßÅÙž÷Íσ^‹×ê»×ö;‚'ÔðÌ‘꣠O´œ‚ ^ê§Pˆ6˜óG¨9/¦FrŠ3AG2˜}¤…»GÚ¼9KËHû‰—eí)e„ø» òÜ] N«èâ¦ïU®Z¤ÊI¸Èó[¨pFb%Ý0 ,gCåŽtyMub”!±ÕyÖ3ã±2¨q+.•šæŸ(cqTC“Ä*i(MÍeªy²çÛvGG¤t”ëçÄ’WÑsÉÀä&²IGÑÃ%š`!5¨w p®'¸þ†È2OÝ‚ÜT×µ%¤jA¾ãsµI²Âã@÷XkÀÂIYtBþÝ&8L»¸GC§’vw¬èÅ–c¥³E¢³µÉƒ€ÕÿpÛ¼ˆÀ@ÿ5Ú* îì6Dœ’æL$™u.®Pº`è {{#[caëó¯æ[äÂ#• ó¤BÌ}ÁړɨáȦ‘Zª uʧpržëxFÓˆ5ß|G•ª*Õȵ©ªU °È>”×Xk |fÉÊ™+Mc›Ú;Ä–04…Ñe[«y_~¹ûÕWææ\*Ýe1A=#v{2Ÿv^^vž¡ŒD!5‰ÿñJÛ™l+Ź®QêÔÙp6,c[æHÈX‹4›£oÛpzB´}çàݺš¬¡Ô¬iÛ:Šë .¸HEs9ŠE=/!Sª ŠfÀ°óf‚\ùÈÕíªMF]ƒê JÛB«"CÙ¡ºI ˜§ }2’H&êä°Õ¥¸†P«©‘¿Ô>pyÏî%Nî_ðíܺW­”ð÷–=áÛ(|jß"Ù·¼Ö„æ¶ÀñvÚTp›§Ë¥U=m*ÊÎïbê+—Ç ¶Y•+ ÑÆ.hžE›)ð{)ƒÄÙ‚oG0*nTÚRœwäÒó<“¶Äeèþ }¿µ:G_ îv÷ÐO]ur6} ÁZœ¦H šå}oÈ85¥6 K™‚6Õ¢¦;D/[ÝHäE83yÈ?Ö‚$‚g>üë,¤V&.¯ŒèP-´v«¸NÓ ¤6úè6¹Y?úþAËË(zÿ  q=Åà‘½è~GÀ`=ƒŸ=÷¢oàgÌFßÂÏÝ¿7ŠN± ø½ý;4уÿ<ŒÇpO×¨¡ùƒsÃëÒ»½¡£e—ÆÙíÉP»Þ`»4Ü®±s—FÝí2N¶‹ÛxÓ‚Æ2~K´­ ›n‘ZÝxŦøÚ‹Uoú«‚ÿ¨k|íèÿ9ª¬ ~¡¶zU·þjã¿ê`¬ê¶²3ø…:I«^öw?UçnÕ›•Ç/ÔAm|Y?†§ÿUÇzU·•“„_¨{Ðüò—Gñétê6 PïUY*ÝU<•Û¯†¨÷ÖrUn¼Æ5%ÝÖ°îßy9wN $x3+¡n4Z]Œ¦äˆ )ç`Ä«DÁ¿ÿÄZAç¡ÝÐê]f\M!mG/&gK¼C¶bûG¿ÒŒ?ÚÝÒë×¶ø lÕ³Ÿ]bŒG„‰AÔýKêž{Rá1)¤\c-¿’'-ÅÊ3Ï;5Õw‹g½GFÃñò–ˆàÞ^!Šw.Cž•ÆQDÕG ƒµb¼¼èUa‘ÎðªyIÇUýsÛ ãŸ?J)¨üy Ðtûp;¡yùvBóæ…Ðtûp;aüåùÜŠIžÍ!â“1!-zf0^™¥Êl€ŽÕ[U6Xâ é‚Mk r²Ø\2\íÈ€»Q9µ•óTÙéÊü{ÌëIåÿ >à­0 ª~àªUˆýÝJ3)…‡õ!ë‰Ë$¾³{ó×ZPk¸Ë!! gë/`xïéÙú[Þtz¶þ¨‡›ž­ì~^ez¶²9øSxs׊œÃMD΃KœÃªÄyð œCϨN¢ÉuBÀ-¾lD®¬Ï‹¨E{lÅ…¤Ô˜h×(ñQ'pÿÊüê£þeƒ-`Õ¨œki¤þoÆl#õ'v3^c YɪëTÏ9ê¯Søçè«Úëôг÷FÛ{8ERë“â^.&¾ƒ.ƒa6†N™>@üËè*cW€t‡UùláõBç7£8°f^¸ëW¢`ZæyDµñÀì ÇF)A›À"‚Y›7*F °CF‚¹×h1YYØHÍ<ÿâyF©ZÎ’…Q—.’©é‚›ä}B´ƒ¼KòŠv4Ïç68¤L.â¢Ìo ô†˜o[ ƒ+i¾&¼" ¤ ð —´íb+Ö$Q%úƒF¨†XØH‹swÇo9AˆK(ÝÇZ¡¸þ¶‚ P~ߨ\NœÐ^E;íý1 rEL¯ßœ½ \"í¶ lw }Ì–7œîe†Áž8­ rüMwN…+ÔzéþEt?‰cî/è˜ûyÍ4h‚ ÂQG<L pîŸ?5R'|ÙŠZÛŸÄi÷•ii瓸íZ?|Ä̃ñ±–JïûS}ôVýô£šfc„‡Èæ6~Íò@Œ›‰–®H(zs¬d7²áól!Åd*§0”Srj˜¶¿#Xy/]yÑà~6Ýs N—sŠ›’, ³ôÎ_¤zfJ÷Æ#GsÂXÌÈùâKw‘!–n«C~hysó³ã8¯ˆ\gæv§Ú èŒ8_ÂÈx‡£Ìáȃ‘¨AŒ€vvÍ ,„õØ? 3TvFÄ8 ÇÄWdvè†o(f[æøë¥9‹¤l¸BV¶ºÞ>è`ƒtZÔ 'Sp?þˆ²Û¿çéâ*~cX,g×å²Q²û;¶º_&üfy7¼#à%„=~óäô“,†îБ`mn(j0QëéË'OO_?͹͘Uô±˜]P6p‚‡8Y$,§cfË%åYuÒ™§M‘P)Ðíz;j½z}òìô{>~¦-`ÉßÂ(è EÝÉÓƒŠjšµXr|’> ]vQMÒ*ÿåÞÒ©=4ˆl”âuyHÿ-t`ÓÆ |'—s¹•]~EÂ7Ð× (®5§$òÙ )@«MˆÀ~øM¤”ÂAã'‚qGFbfb…ob±‹Qê¥×µÄ3b¶Yg"¶iz±¼¢ëß@+7<ï $Þ,÷ÑÕÍm[ßo\`P×ü~…ÄŸB¾%þE¾\ DÕ4U‘`tAi. ­@Ç­Ô©sÕb; 9‡dû-ì  >ðar㸜%Wñ¶dÔ€îàâÜyÖ“I~(ÒØý=à¿J§;h2bHì+Þg‹|Ž æ}²È`Ì=ýú›gÏ¿yÓ2Í]¢“7YÎ'ˆœ­vfÅz»áVò")Œê¨¿Ä%¼%¼¤-éËV¼é’þÖ ùòÕù¯[H<½výšÄ fžÓÂ!š‡žâ¯03n?ªk¿0'˜4 kD³•Q”^c‹èUqo^¸Qø† H\³ýPZ¥Ñ/ÀàM]#EBuÀÕ2JÓ”ä›YÌbå*i@-ÆÇ‰’¡Mt`T …»æ"à²MÇÂõ²Ñ ³OpWæÈfØÒñÂà`j™ÄÏy‰¶‘ LˆÀ¾xüꛯv€“F\iÙ®§cüFE¼–©À‚`˜n>#$òòÿèFsk“¸Á`Jà%pħß l¾½À Œ¾ÍïàxD}ˆNO<ºÚ},ÝGµÝ§Œª®ú“YqOÅòòÒÜ—”dt 5Pé¸ÈãyÞ"7¢=À[]í¢˜,²ÛRˆ€Un(8…¡16“Sf:ù¸Sv2ç»Y®Ø¹xÝÎESð_aF€8H%´‹I"°M<‰ÅH¥rºsY÷(<]_^—åíÑ£G—åm÷j¾ìæ‹«GæßGf¢¾l¯ÔÝ|ÓÓ]zaxÀU©W¯àò^à›_ál–·2ïL!ZוÏçÜÊz‹cżHvÇù´0úþÄ9E<Û¤µ8Ž+-xvG±>î¾ùóÙËWoNßìFvmèÐõÏ$õÿÜyo~âu„Ǥ·zø¯">}öæ?þÚy?=y~ú~Lâóo_ÿéøù_^Ÿ}sò3ýÓ§ÿñ¶•¿vkýkg`þ{Ÿ½}aþýœÿ}eþ;3ÿê¦&ñ“·¯_Ÿ¿81ßLã'ý'ðj)?Ñ?ƒn哹üÒª­L¾ú>æ±àÏû3ü÷Öüwaþû“ùïå_adæp³˜þnþ{£[üI5ô“jè/êó¿¨ÏoÌßšÿ.©aÕÒ¹ùôkóß,~u|äôCüìôùIÿD1.ú´&ü˜¢u 9!"(«@y@xű´cÚl…¶Ìd¶O¾÷=ÑE@£bDÀ}-Pþáüû}Á”§Õï€Ü<쌙¤í·¼´^2jSÒwXÓ9c8ªñ6ðaÃhð£Èâïíì˜vÁÐ…PÖm;~’ßÞcRzÛ𪠔Ý^n~jGg/;ß% 3òòd‰Q8o$pðújc± ò '÷è^ý J?ØôtvaÓ°µâœå¢¢€‚þš‚Q°‹Q%ˆ"®t›®DBp¨¸…çµ€DPo53ŒñΈõí°š„Sröp9=n`F®çbJ6cœ>4„N$Œ)¶!BÕŒ¥ ŽøLñ5ÊP. ¯‚úF˜=}ytªÕ1§¦Ó± |ÅcCx8äã [ohµq%\—pï¤P…X8¼¡0ôåij‡¼DX :s.‘™ÛçJÇæNT{<‚JmŒ>Ã"O²Cª±1çŒÅäQÌ éÑé‘ÎëÆBæÛ u+>3ÆÆWÐw<>¡½°žOa=Ýo^Ò¢\`%”MÖÓàÁëÉKÉ«Q»ž4â –Ô ç×,©«cCµKšÀ’ ®¤ŒÖV¾Ç+¹œ¬xŠê=JFØäÀ³Öásš.HÀZ!¼3Ï‘}üJSÊ©t5·¼`4^>Å€.ËkœÕ·y5v=¹s·!&3öè¢~íp¼€ å\ª >`´!úd±ê dŽãP+Ìv`&´}XŽ*yŸ:ú2KçWå5¡+”%£´6[âà‰cÎî²Gb“)xRµÈûÄb奇AýdÇ¡*õ÷ãð¯pÈÀ ö\ÙŸ$aÃ!uäï]îG ârhØZj¥î@0òdF²ŸÈѪ؞Ä`%`Ï`ŒØûØŸ<Ò·¼ˆ‚¹-˜¢(«˜ÇDx¬‡5.8©Ãl)¥ó³$³ÛÂ'5z_Cû6&¥_¤+Ä'”Æ•,(}1s=ñ©F^²+5%s’Ý$3s44øôì‰SIï6~Yn77cªðÛ=cè·„~¡¦d÷È©éÝ6Ûf$ÛŽWͪî` W‹|yÛ!æôì5WHTžÄJ2ØmÇ&½ß"1˜- q!7Ì|[¦wäHh»Uó™ä1)Z¿ôsèØ mÏ^w §¾;Û“–*°»ºK?˜;l¶Ì,4X›z”Çbz¬¹ÝA†—ý&¹ÊæÉâ¾³œg:öp\nvˆ¿§©aèÚc-M˜IÖ:dëK äOJ‡qaÁ *-6kYë•+š>Á¦ œz2ãF¿ChÓ±ðNWAbí6JÉ/œâ§ÁM[·Hi–77÷Ÿ¢O¦ué.†D›ø½ÆÛØ&€íÀ.`‹,½”µ”ÜhÀFå›eœ¤‹yÝ Àö”¿Oß Û±‘«<è÷OЯyë"·¬è™­161ԃ⼥~—ƒøÃÐö* ®µé+iÂူR¸°å®©üWÖ¸’€qÌ9\ö¯ ‰Êó”aƒ“µI-Ó%ŒÆšqhV.Ìat€=çÉ9ÀáÊ“b¹P…Ðx…Ü1'ÀuLDvÙ4R1 tBQÁ6TFš¤˜y‚'–qÉmÆUQÚ6…s“›]é{6¿îÖaì»æ”AV uíÀÓkÚ±$XÚ!…‚oµ©“`7^6°¤~:µÁ!Àt×?’˜Ý1m0½¤Ht´ó9¯‰BÇkùw8}_f) …ij^Ö]ÐR‡óqn‰yý ©pfiÌAœˆ`zM‡6a¦Ë…gÒtE¾%´(Ÿ¤S¬©îÒÐîÑåO%x°5ÙŠ^ñ› ù/vÈË9tÏõÃg÷Ÿ`ƒ©!&«'±z€¿~YéÍ Ýá Ën mË]¥WÃ× JÝ5ƽ=¦8p€ÖûꥨAÐì·x…nÓtÚ™%‹«´ƒ÷yuIQ,Á¬ÏKæ±éæ@¡Š b¥Sê“eB×ß%JÿiQv(YÚc9¯—sbЉfœm0'ǦÉ ‰ú»¹-­êF›úli3RïÑT! õµí<€ÔS;l@z(©wìéý9 ææÕN™\ÈvŸà'`Ý'·¡esé–µeêK­Ÿ©nAH/¶¡ŒyõrÉv4:‡c<± ã" 1d_ãEA]’‹Áh Åðö‘$Ïq­Ø‡ês‰ ¶OóŸ}gnFþ6<ƒ†ï”ûŠN™?®É”œp1Oi¨XÌJ”[Wš–­›Íä|ëDŽÒ®fm'R†–dZê5hÛºnK@0“&Áÿ*øÊT5•ú¬†×ð=Ë¥`ªÒï¯pÌÉ \dFð‚ïÏÓÅ =埢ݧ§Çßœ½|s~ú„£ÎQ·3ZWþ@3bæF²ëôõvܳ´-ªúwúñö`<Þ±¶sàpÀ1ùôäÙñÛççp‹N^Ÿ>‰Ÿ½|ýâø<Þ¾”<üP‡Û9¢á=ñŒ5ã-Jª{êY5Ç­n‹gSµ7˜oÛ-Iª©Ø ÑNàÌd1x)oÚÈïp¦,í #4øEËûÞÒù¾Cß¿¢¨äK£[=Ú<•ÒSo¨¸Qµ†Q¨øšW²Ä£¼|qŸ|ÿêùñÙ±8|cžX`~ºN0| ^K_× 1@~®‡°Z sO¼ÅT’®¨œY¼Xz%4mÖÛ–auÙÕz•A\µ*Ÿ þƒ_•Ÿj)E&;ëkŽJÞí"pÍ7q>™,E¤3€+ÅïAO ™©kR/06UÕA­M²§2Wäÿi(=í|øaCNhp»Bèѵ¡€š1”@Í’Qd%!BÓË/T1²Óx‚æÛ©Eð6ê$Ø(k‚X½Yo¿JTu§<ÍÄ #œ`žÁªÒ ´+:˜õE…w1k%Õº*h·#Æù@Ï”W¸lF6ÕàB_µ5Ú¢šZ€‚§[J-@$¹žÖ¬œiÅŒ²€ùû4Âø-,¦7Kæ:Ö K‹¯l¸]ÍŒþ̵ð›‘Ùä#ÙÃbk ³B7ÌuÆ@Ë.#[àUB¿œÄÜàDYǸ‘þbð,®ã¿8†Ig xžU®#¡dæIÌ|êa¥Ö‡ûÈR‚Ê HrA}46›U«Yå::M!(ø‚ Š4Cä!XÙ`Z‹ŸR3æD?08‘¢*²ñæHÆòà €c­‚öeÅøNX«†œíÂu€ÀØéˆ ­(F¶96pBÇ«¡*°ÆuÎŒbL(Á<šl¡`‚e=×ÃG›Á»ý§àÒ³ez fÌ3,àaÚG´<Í÷ΈïÌѵ¢Q¤aŸøœñóÄÆ@û s-'yÔ›±#ßðH5Mm§°}&e"@(ðóÀâ©¢¼E} £àºãpÐKæ«~žì Íw{1×Hô{ýî oNBRˆ4ùíu‡µ-*-úM¡ÆššiSXÓUˆÉ?ádú1ÏÓ/-߉„‘fÎkíèÓÏ?T~(ë­Ið=â½øs ùü¨oªÿN¡oÿûeæ®ä°ôÛF]öŠt?6 :Ü“ÿ¥ÁêÉI¹`“¿ÇÁ00ËÂ'>?pCµ Ð×Ð ½Þ4ÁÁ<<ÜëõöFðÄê r3-zݱ ¤ðNcøÈç_ ãšâÀ>HtXxäŠã±\UxåŒ?gä]¹àœIíE ´í…_ÐD¡|OOgìOgmùhˇߨÁò¡¥!è± ‰F~)˜Ã!‡ùßì EÙtJÙLÂä0Á«H•–ÜäKª8 ¡âÉÌ‹™—\t ;Ydï¿ „+£zÎ]Ýu;*ŠÜ™qÙ.Œ·WY¤*Šbc@UÖ$ì8ȾוÓø÷™TQ Ê”㎗¢@¥ðædevoK3¼-6ºƒu$¢ÒÏñ†ìFòNékä+–¯c¡Ìl÷k9C‘²ÈU|6"-X݆ ·®–4«V~ŽÖU~ÞåàëÝ8¨üì1ü7-ØöÆb½ ÷¼y–â03GD—ê"‘UXˆ:<ÈGvE9gL¤S½ïÚÈ6)H+ÛXˆoŠ‘ëQÞ·æ)#ÒÌ%Á†ã(&ãWrSÎZ;¨HW—†ÍÏÉÙŽ?.ËIN© »d“¿™3¹Ýß©57tÝ„ÑýXM>9·åÇqu©5Ûó•ºV…Ž÷Ï‚ýhÁ—¨!²rÕ¨D!qÂqaNô¥¦vu~?Ÿzþ}úYK]ÒÄ&,âõ#DŒ`ñ2|L °¢ s~!”;Ï­IZ•ñÛbƒ‘lÚLuL´”•Í+S@ÔY½ƧþÆ%è Áid(oZâb#ˆiˆØÁµÇ£Pû;ë…üvÓÍ·zc‰ºÊMy0:ó¥¸r=æiæ×1¯04tÖ lüd÷’¢¦~Sç™QärĘK>€Ä˜““-"eyf¯e •OB=’k»¸†Lƒ0RoFáIÁÊh]Ž‹eFÅžDb ·ëbÉj²ç¬­Ù!q’pü4áºöa [€F ³€aý‘À$à“ˆÍƒtÇÀž}5KÃ}j³¨4Œ7’ †˜#8&h¼ ÀE°† ®äMŠèAª¼îL6ŸçŸ]éOVNkV×Ugº³9Yá‚ë ic“%ÔÄè­H¹— þƒ˜­©»î&Öö»ÔïXÎ1šœêÇ)s‡@W‹ëܶm­ÄT_ˆ¡ =1Ò˜¹¡ù0©>•ù¡²n B]G+(Ú÷Ä»BñF /+›y Í‚j,S±©[ž²ÀxH6óûwìCWåq,T‡å³þg Ù}fÔÃÏŒ¦Ø‡Œ"hÕ ó3(k_f«Ü º¬1ñ?=ù}0 ßDO>E2v¹ С¼Ç? Ã÷†ÑÓÏFŸÅ£.•瑪E}naÔß ßQ‰¢væ€ÏK/3Õ_‰AK¥ú\ÜG° f榡XŒž¬,Dßֳ踥èx%xdfâ#½°ƒ‘ÿ"®›†]þÖÌüP¯,ÅðУ;2ÿ ´Ü-/®FøÒ(r®‰uå9Óý8öŽJ,+l¡JXÄ[Þk[È™¼ÏŒÂlÞT„à:»ºödNï~ÑO´0<ÅRÖ¸ÎñS}Aðâ‚ɆšÿŒ«Ù‰Ìû9~ÿÜ1[‡?Á¿m°7Rt¡„‘ [Ý/¹H%‹: °Ð ¥T®ÆKýæ ×쎢Dñ63}~$ö¡” ¿Vú¶Î¬µ·ÖêÓ·6¶ú8›Ô¨þ+—¹MÃm`Œòž¨ö"KcHý—4„á y ¹4{Kp·jì.þM‹"r‚7ðç"þö²c6MÎüpÎüp¯ WbԙߣŸÍ%à»@WoKÌ·îˆfèr¶‡cU`/¢³––»¾]]g“©hW£TXiš™8‡G.r¹< b4D•}0? sIåDuCÉüÂæ†IYs´úB^Yl(§g¸?¦II“ètYà’4¯8eµ”®#7hIBñ?¤jð´“¥Ú $›ájê]¢VŒüŒÍ5?Ì0çd¥>¶Z¢Œë„‰È &ë&ˆBŽÃ¨mÆ—®°\#ÛD㻓€ÿ¶&!9¬PiRb&KV07]tñ¯ÃÍ~g&5´òŸ„Âùò¢Hï9£ÍŒnÙ^Ä$¼¸X¤ï³ÄzîŒF töÛAõ–S’–Ac q\I 3r2d{²zh„/:֢̄†ü‚îIÖ( !ïlUõyÁªÀ¶Õv¢ä^öˆ³ô‹6»<‘jÀ§×¸WA«º¥3ê©m ?²ê¡t‹Ýá©·+ôOQØÉlw_ ¬~tû3ú?hI³Ð´oé$8Y-œøØàwH-\Þìl¢ëFÍMv}èDY°&÷9 ¼|–ÈšœÊ0;B´e£ÖEžrÚ‡:]ÃÎøhÔÙ[ÇNÌEq**ŽÆ©£ZC”ÈlŸý'8¶KÌ.âQƒ-"j¬²¨b)êlÇ‹ù«i,ÊèôܨVÏ­:|=W|®FÚQF PÍת¹hñ¿ª‘TL—³EÆ5¶œ›-©’‰Ã›ÿÍŒ ã‘íòé,‚úlŽ×õÐØƒË¦’8‚xRë\­º> `7Vå>ý(—¼pú`¿¼|ú`çôý§y@`wa•hî,ô 6Sƒ¬)t^!W ‘R.Õ‹ÐæAþ~¡Ùº2gy2u䲫êÐóðªÃ/˜é‚™¶v€¶U wcB®Ž¨QI”ˆâõm¬;<º”bŒ6žA`±_ó™w«88„tM¬GGh¬„)Ú„p™O…¼P© ÉnØ*©•…ÄË­¥záF’ǘoACO]²{ä¿rªýÍSÇ_?Œ\§óS¨ôJ˜À\>âÈÉR–yŠ5)²‰áyµ¥²Á0níâ&— € ìA AªN'u¶ì¡Í+Ú®Õ0ÛÄÚZmóÏ„” WDqêfeóÜt½Á)X€¥› 9RuSý}¨7Vâ")1j¶YÙf ×5wå‰Õ6.ÍxwâØêŠuôW.`ÝáBÕ8 ·Wȇ6€ü^;%U fuÅVXy‡­O`×ÝokÃÝ“˜'›u^b²ÍÃè¯Q)ýa ?^ù>ˆÿiMɲO¿­)Yö –fÝŸÄ™æaŒ¶O›!ü}ú§2B¸è€ßÒ¢-û¢a³=›Çæa>lŸ67¬ûûôOeXw¡ ¿¥a]ö %ñf»: êß©ÃîplŸ×÷´ÊÂïïÔ?…¸E6VÒ¢¡¤¬î¡NSkÎÁÄk+VfEP•qE÷Òe´´”«—üò2ö¬ˆš…‚£Qg¥`ÀA´,`¨ mª¸ƒ®#ÿú—&~çâµ ô;ûüdáÿãùÖ¿2»¢¶¼ƒ—€¤,Õ€Ø!(ïÙ|b”ü"Ò6ŠØSÐ6£ë͉œñî<­u ”¯PX B‘¸Y6) R³‘|KuÊF€ë— %uçšgçÜíVºt"ú=ˆè¿œgüc‚ˆF<€Ãú¯``¸oÁáÚ…ñGP8ð{Sí¹^d‹ú{õß!™I3¡Y¶_»Iÿ=B©Ð‹rDP*–—hN“ü¹UË,ÛÖµ¤pÃNoƒ#Ö;È"ýJ¿u¼Q©LOU‰ð5}£3sE ™Ù'éu>uïb®êRq²B§àA![9¦lGϨs9ªì «…Û[|êlÐúŠF¿Y6èBeƒ.ŠÎ Im¿ Ì3àY£+¦&Y´ œÌ"§ÖçáhéâU>Âౕ¯ Îp'ˆä'Z-•ûØÆ•âïíÉ5Ò\Ýã9_Ü \´€¸f Ñt—Ü“øönÞ‡ÈrÍ\àÁL§$õR±Mx7`CUŸEаò²ª{fÑý H¢ {O¨\Õ»ãÇ?ÏûùàçwÝÆéGï^¿Ó-áZíÆï^CÍ; 8w;v›+ÇùïïNç—ï ðǬ\VÞïÐæAÌÙ6¼j Œ¥H“¯ÛªÿãG0³mfñs;þÙLd§a@ Ä‚ˆ «‡YŒw•f ¯•DxÒ¡6tÔ£=T–¸Ù¡4}=xgNßw¤Ãd°LüյDZ”:ôK¾·ï^oϘ2ïïDcó³á†óÁλ#ïÔR Š6Ï,:íè#<~ˆ…æët±:eH.Ò‚ýÙIéÜΣjfÉ€Î@d£9xˆç…Ap Ù<öÐjêÑ@H„ëŽá ä¼a “’ʰ„p]B''Xÿ©ÄÔD\ wÐ{„e·"Fõð}„†•{E|ËYr‘#.1’FtE¼d ©@’ã* ø±j6Œx@pyýÓ7ž6hƒQXÌØ½=µVN•3KóŸµ,ƈӻ-èÇÛfU;LŽgAzêŠÉE•9Æ›c¤ç(H3uÁ_ÛÒ©Å;ÝèE¾úqöÆ8Ïâ~«q{˜DÊI‰<üä¹¢'ý¶¤“yP…J2‘?üìºeùM(b1dêK0à%Xbí—Îÿo>¥Áº) dJƒ’µÐ€L†!Š@Œprø”#”€Ë4$·ñãhrËuÚ@s•Ωġí¨ ÚÒÝfr‹’™!t^^€Y,ooó‚‡Ö;äE´¨BਠñhÔ#äÄ>„È!jù¼z=ÿD…¹3E©ë-Éc+657 ,a¡GP û¿Æš2XgnUجD³Åë Y =Ôª]í´¿¯ÁC ˆãú/ q¼¡Ím­!ǩ®QÇáÔ~‰^o#‹ÀŠŠ‡C^¯ûÂß ó:Û§!Æþ©£lßÏœ{¢Ïÿü|æÀÈ'ÿƒ!<àÌ!9®€ôÁ ø'0û§9}ýîžüÙÿ?–â™QîõöFÃþpÿ¿ Åë, Àýpü¯Åp0mŠ ek£ç>Íü£oÀÖ ¬‰„ÖQ²U*Œ¦¶°V¦‚’Q; G¶¬¹2˜Ùz<ºlzèê õ" ¸1^Å’™”‘³îX¨¤5£¨ƒ` *q8 ±¯¶šÅsC^¤W°q—Wa/ÖW—¯µ‘U ËÛ‘7Ûn‚³’AÄtFD‹<„Lk[G÷yžý}I¶Q¿G;Ëõ¨Íðç˜R5Ø@Ë»M>RÖGPK-ƒ?HSì ð£ømçv„£Îâ?±W½V8Úk…SÛ"ô®Úµ(<×:y|üeÑ :„ÏìÕ.²lT9„ÌÖÕ.¨¡a¥¡Ð×ÏŒâún#f^ Õ@ñ!Ä-‰†6sùù fp³Ð÷—<äö*‹3>;’g…‰Ôêbyy™M2ëwЖÞðªCNd Û‚¬vKÝzwX‚‹6]òΠn³>P9àêÒÿ÷º;îxhÂfÕyEvÀ…ÊCšmDSã*MuVåFÔﵮ ÷ª.ïGÒƒÜi€R2#RFBŸ’1´žV<`WŠj]¢˜ëY`@æ|N—ÏGŽ¡T¹ì€ÕmÚg£c -º‘¾®Àgó½féÉ€nÚÅ…%ÃÌ®(:놯!Æp¯)Hpÿm¥;Èà¤nÝx\ ç K™1¢CbÓ¦ž#ÌÏx÷<×ÞÙ=ûˆ“á×™{øÉˆødÔ;ËÁËÆ³^u8"}86>úpD•Ã?ìpD•Ã±É Âó­ÞÞúó‡Ð;QýÛk‡£€Uýµªj0ÿsüûÚ–GzßÊ´0óËæôA°DºÐUÁÙ5<ÈëœR,‘‚vƲ`$b< Œ·y¾@w3„,˜òÛtAŠû¢LoŠ6#ç‹G­¸NEL*ƒa%)&šTÔ”}m¶ô1Ìœ««Ù{rÚâó8%¨îÜŠ”èóÂ3¼ŒM£5º7ÔD§árÁ:ÉÓ}†¿™ùÕñ¢%‹ÜÄÕÛR•”©öB!¤‹;$&q0”8MgÙM&Q—(-éLÿ})9¹Y¸*î6Á'6vž~(E`/Ž˜¥Z ÂìzüCùüý‡£nKK Ïý°øáò‡÷[?ýaõÓÿùŸøx«å?ù¸D„|1Mƒn6„MDÚN"§W1í^1]Û½0§úÇ]vêAˆûH‹•!–žÙ (âa¾0†}~â@d$pzÇvo·v`¨†ÝÏr~R\³áÒKmLvA“%Á3f1¨X^eVRu\s©@(œ±+ÅMO!ðÒt¥…¹‚šÕTU‹µ™öù;`¾ÂGB…¢®aðáðŠÛS ‰îTú‡ZB)Z?@È‹‘aÊxûÂŒh§-Ÿ_´â‹dò#–‰³šaÐgÊu²áÃy+æJ$ö# ÅY,2¨Al¦°\ÌíWæBá®ÚJsÉóEöèš3(=m¿1ôÎð=*F¢?ÿ‡fØÙµýðììŒ\„˜·Ü¹ÈJµÛD°<”­|R ,|lÞ¥³¾SÕñR®áë–ä÷ß~T׿‚JU^ü‚:ùö[ê''fϽtAC\B‘O €™ .´¦C•ب¢E¸4f3µ|ÁP;5Ôˆ¤wŽäÒE»þ¶ì¶]Åó#òqø¡Ho2„[¥Oé8Á»Ó¼ÜíF¯x24ôÕƒ)k'*,pD!‹°ØÐ,|^®§%ÕQãXdä‘D ÷ªg]MHHÂê53ËqÜ5„åCZ°Ò¡RêâBl“;»••”Ööuñ]â‹€ à]WÇlÛGr’“ä6U4F Riþ@7#Ò|UÕ$†jUô¶mÝBwÃižIë‘´cÍ$ŸrHãu~7§žÌd^–¶¾‘n·$浿aMJ)¡h#u*€ZÛJ¨ +¬Ž9Ø?lL 6zÅ©ÐgY•îòb–FÈ3vå„!ÝAA ºÂz“B¢Ã:SfqZòðgyœ¼§:]§ßcÙí‡æCU~ @tÈÆhH”ááÅ9eR,Ò²¦ ¶›Pó õÄÁu‡!Îæ¼_´º…;/Þs$à –Ñç,\ܧ^(£cc=¨D+ËÅ­kµ©‘ÖŠÂñƒdˆªÍsôå‚Ä"É®ÙÂJrØû ¤{o¶t ß9n¦@{[m+’“¤ ºn:ðÎ Gn¤Gá”Ìoܰôî—|ý¿ÚÅBïz„f£îáúà/Sž5äï?…‹)V\)-Q3ëvy²Þ´Œ–b˜ñZ\Ë?Iæ`ï‹.š6Ñ–¬ mˆNß0mŠqò%þ=§…ˆ˜>ÑnÃíaeš„à¦2¢Ø.Ý $6\îÛE ¥¶¤ˆuH­)‡`ÅK•W„GS±öàÖßá(¸dÅ"5ê1IžÂ~TÓQ•LÜgð‰-cá;µŠô'XQ!ö–ÔE¡H¡%}V(™æÈ\ù,»ª~žú¤%}'ÕƒÄG,¹Ø¨u@&‰E÷ËŠ‚B#š,ðô±9ÙJ¶ò`>\¯l6뀋å\U9½a_· ¯éÉL%†åäsŽ0›”-XõÅ›§ùÕ£o¾3û—ÿ”*ýO×-âïZ†Ì6j`^¡œÜÂIð|pE…ã‰ÈéaÓêÔpL\=©‰Ø.1²œY‘-¸Fdͨ–.N$|æW×~DÍèÛ»IKB¨'‘XÆÞYŸƒ«JÉï]³¤IµRÈì @ÊŒ0âìÒáFíÍÿÀl‡FGåÏ 3,X˜by/5ùņÊaÍ|ã ¹¬f‰,g5wè2û·úG”038ÂZŸ—‹|®,y¹†¯Qä®Ñ©_­‹²J@_M¯ cQMíPeBØNZ   :…ËCs)ß褈VÒÍþäWù²àT(5uÓ3ÌÚecDáð€A}ܨ"ψkM­u#“EÃŽ! ï$óH@!kØô„F­J½Ûg[e“3’÷\Ò&5N‰þ ïGžàr[´@ËTi«µ¬t2yn8EIèFÎ`•`‚¯€Â&Ë€m²žêºòf°€ä?´ 4¬Q0 ¯QÌ–d+s`‚CÜ]<Ã…c)4ÇŽ>]tkßxȺF"GÞq÷@+>œÅ•Û»MŠ$1Ý"ª;w@þÒ‰+îèR©6ºXË+ñS´ð›bLraî.Ù÷ £ÒIP‰\¶ýPUƒïtŽÐ/ÙïöÀ_Úé|¿wòûú~(¿?¥ïGòû }?–ߟÑ÷{ô;8w:‰tÒ§‡.¤“ý>‘N†ôûT:Ñï©t2¦ß/¥“=ì$ˆ–æåÛ—~&5Šè5ÚeF35k*¥‰#¤y’¥ø¨b÷®äŒX7ü£)’SdËýÅÓ¥â×/¸gµ§½¶:Y!pô "¥°ØÉžñ¥oÁdYìxƒˆßgIÕèÉÙFˆoßfCú¹-3"/(ÌbÇ€$:EMšòTÁÔâ\Ô8Lø´š¸Ç©Ýõ7Sþúž]RLõÑ8~°åy¦¼ÈãÛ|¹âN¾ÿVï…`¢UÛ#µŠ«ª"28„ø^ª!,*\ðiÜ:‚¡À0~(€fÆö ÆîÞm …/a ÇÍAƒI}üÂFþØ¢÷E- ¡Äè}ñé¡(šÃá+Èb|]ÿŒëâS,FrÈ`ý·˜§þéa'šÃ!Èb<©ÿ Æ5ù‹Q…—Pÿ-žŒÿŠÒ²Oë¿‚qM?ÅbT:£:Ð:{2>=˜CÓbŒ+‹qRÿŒ+ý‹ášµ'cìÃÿOÆXÂΫ‹1þ´‹±WYŒgõ_Á¸.?Åb¸fíÉPp†þ·x2öº{¿¾Ô…e:µe–q`¦ÕùZ5 ¬…2êb ÑžGÎP&Š\µz’Q ˆ·Àa¿£doÿPÈ,×›ææ#Ã²ï Ÿ™d,¿½Í=Q()$T…+2ùÜ€ãC°Çìgâ©9Û´AO=w$ŒËD‹ìœ`Ó±î#WSÓe:ˆ__ÚhŽ9žçÔÎgYP hH]uíúÑÁxsþúôì›>ÿ;@Ë,ý|A„•?Ò–g˜8ŠºÚï®ç¡5ímžÓŽNú¶ÁÕ|‘¡pœ”up…[ôt\¤h\$ /+ƒ›ˆc؋і#¥Î4%4ŠE8Rë¤ç½,8š60BÜÞšÓ–8sžßNѪ©^ËøüZ™³§= úâ™)”­XjÕ¢ëÏÖi¨øÌ1&Ź#É3FèÛ>ª¬‘ÃUwZó_{ˆéU4c0ý[2ñÍžL#àt2©C ˜Òݹk‡»¸ì íF®ný>8/ð‡ïQªÌì^ª²ØˆÔÄ–Y™]Ü×ú~õ‚s–‚^.wjM}”O. ïé·ÎD`˵ sº›ÎQäbHåŠ?/—âdú÷„ì0Êýd¹ÈçLž¿¢—ž¥üÕùfTûR¼7ö_z‘,¸¹½A¯;®ïiôt|Ë/Åû{MËÝKôÖy!æÏhxÐëÖ¾5ꃷžÚØ÷#£¾ åEòñb>Ñb÷?ñbï?d±÷›{üÅì7.öpÕbwö»}÷¥ã€ØTqs‘cXAR–FJ"F.)Š—Ö•ºØP¦*‹Üˆ‹Ä:Œ\¤ÂMPp9wþ9ψîÅ>22Êš.¾±”BƒŠ5&žªZ­îa³v­Îϯ×ZÖëÕ’0^é:´Ýð$þ#sJ¥Œ¬B8‡pÕÂÿ[Œ­ª:ÊÕ¬þ#Ví 22EëÂ$lw­?…†ì:½Ó”¸ö!Åð°BýžtëŒ\Ãp…ü‡P‰wôë× ­¢½3E©Õݙʰæ5¶~ÄrZéµB_d¨¡(\—%%tE®ÒT·.fM9RP>¢@f?¶p9£ Œh!}Œ|ËVh‰=®ŠN8à rŠ8ˆßž?ëHp¡8Nsò˜Ô”ã}êJ9ͧõÇ“ÁÌÇOЈQƨÕ9'…ŽM^¤ ¤‰‡Ô(\ËAÃÅ=+=÷LWæ¯øëøI#oîãWO¢ øØZê‡*,%²«„,…gœ0)ŸFìÌ3g!Q>(êÀC*x¡U(RÎDbCðÓȺÊÖÖ²´¼ _ÔöðÑFV°‰·­ãk^¿;ŒöúæïñGXq·–¹mä€hàÐþù˪ÏåÖq¸ÍÖ¯ÞÖ©‡·f{YÝZ6×<ÀþšõtÇûãñÞáx<è+È“F~·–×mä>©ʾQöùÿkת‘é­cxÍuK5îö†Ãþ`°7¬dÞŒóÅ+9Êu2¥¢¬E/‰m°²ÞAòüâ ]ìöc™O*QƒÎè/Ö# ÄGÂ/( -gÒƒ˜Ö,ªe`ò"‹£üRFã*ø&‘bQC¤˜ï_§ˆ–´ `1\6Œ›óÇ›úGÌà—zØ¥aZï(Õ£ðg)SýÀPœØ ʼnjCq”Ù–µtWqpF­¸ª†XE†XÅ+B¬" ±úíãDUˆ¨µÀQ.¢3‚jlìk ­Í¥DÚ§5E: 8ÇÝò"ä"¿PGìêÐ)#©SP¤]M¬\”°†gŽìø:ͺ)µ›¦Ñeòy‹íÁA=Ǿё@q¨0 LO³‹ea̧’á1'ºf;Â.Eáwaöôk9:M@Øm‚Üp,uJW)ä¶No2. oŸéÆE„ήx×LîGæ®ÀLƒ†¤Š2–Wv,Çv,ñóìbIÚÛpÇ"@Ó5Màk¯vÕsóÈJº`½¿eüÝëìêZà0ØØî•;&ø*3°®9uK›m¨’]¸“"ô$¡·"ÄSPQÓ[ Ÿ=<ƒ^;ö$4`Š\ËòÚ€P8‡æ½Q/¦ŠÆðZÇ ÝïgØGÓߨç—Ô=žß›[ÕÖsò¦Afa—ÁzóTæãRº sÈc¨ÍäBÆkìZwî%ÎË¡8tw2 °q/ÄŽ±gºF ÕLŸ¤L'ŠÒ¸$”¢rÒÂÐ91·ŠÎÆ µ¦7V d;/ëJî<#Š®fcÆ;Ÿ$‚úmN5ÌÛ•b/óÜ\ÅÉuÄWÉ*Šo”\Ê¥[W ûº°¸ÃmF‡Š^yïÔŸ^®ôl3pÄý>] =»õ÷7¾Xf3Vå`°JˆÞX{‘]`j$ÉG+) §9²,i:Ì.]$=„â›'KJ¥AhdØÄêÙ¸ÔʆP+—!œ<”HR­!f ×¾»kBWÆ ÁY#—°é< D‹tvO©n/“¡Ñ˜æq¯òë(ï[!“„Màv,W#p|O·W²~Lï…‘> 팶osäË÷•%Æyݸo$Á«%¸òãä÷èÓlû‹‹ÏfŠü²¼ƒå³ÄÀg漡ÃÑù¶ÉòòåuÝQñ)ÜâX˜¯–èžÇÁB¥²4f@²ù»Í%ãx!ë5®Äª ;êç \#_EQ£t7 ¤;J̹wîtòI“½ÓÐÚ9xI:àØ£{I`¤çmžJtãð³BÒ¼›2OPT6lÙ¨EÓÌ¡¤X^朌O×ïÞu.@ŒÒññ¶°•ê n48»±•#"Bè"åhÉ‚wŒD»”b±IË ÝìX|VÓ¦¹4#ô¦ñI%xÁ±ÍÉ} «úˆ9²I6J ók[`èJ p*¯4ˆÛT“ å»ÐïÒÖ_n™Ë™Þƒßü³W‹üÒ»Ï>ûìäÃ-”»(¢è³/þm4ìuû½Ï>ëüÛ°îSø Xül æ™|v°¿×Œà³ýšl"ô†qüoƒÞx¯;ÅþŸÎ¿õÇû¦ENö¤‘ GòöÍS;ó³ ÆühGc~–ñ˜í€à3¤þØ )ŽëÇdF…ƒÚÛGe/wpÚچŔh’0äUNŠŽZ¦ë–­/dí=[8xb½!8Ô¹²ýƒ‘¾—E“¸$Øæ—Áô(ˆOÚØUù¾Ë[1 $æ!¬E‘®ÆºÚ¯}en+è«ÛâØÌš@}œñs´zûvC;H9uµP‘5w6ÆÃ®9‡‡û{û£½=(¬]1êÑZ×—WÃõèa)ý°H“ˆLN¨PŒ³Fø;“f«£É‹¶ñYD±Õ‘PC+Ä¡÷É–aa±%%±¿ƒü5±íµ­$ÓÔ,"ì/€]dñDJy\ʫߜi°%¶44 ãÑRë©‹èbUGk9D}ɨc7j³iô)é€3[ºd؇.ÎuÂ,qQ‚ @ÃLxìÂqR9²ÓêòšF•ŸÃ]9¬ªhÛ½ºãŒU59p²hã V…€ iß^ ÆÂLY]Ü!Å)W;âbguqo“+œ &¢÷yFÉ6îMòÅ+>Çʸ\¬˜‚5&qÁ’0d+ÎS^ LGÛtå ™î@—psæ,yD—fnÊë%yDímýC˜Þâ–¶Ù;ZËï÷‡‡ûƒ½Þx£*/Å%¯e¥¸ ä{‘õž b.²—¤a¸ë³´ôà90«C´À0`=¡>IÚ',U 'åNi8GuÊèóü`!ÒøŠFÜpFˆ€P|To8Ð@Ì(-×LTt_U¿ì¦ÎÒÙŒ_Ö’)8¿¢²ˆªŒNÐ#)ôm„ú$Te´xnž){Z7öCÃÍÍ(oS®â÷Fh7JSœc€í<ÕgÞ¾Ö0û®2Àæ›þ cþ6Da”!wûÂ|À¿1Änë±WÝ¥s…ßâߘ#ÑI…Qf^¥ÕÁ/)UHûv.ò¥]qW‹äöš‚2Zò²оmð°(½éã&ÕL06ÄVL¯…-ÐYgöõ®&m,T1*0b¦µayOa‰ûˆ!ž`V{þ`.òJ.Á&|vCZ0úåŸ*Œs=”׋|yÅAÌ·`ƒ]€íŠÀû0i ¥Ýõ«ª %Áä?-ŠÙzêav*VRË?j#»_ý¼"ÁUj*y.ÏffCgmçÒR@ÞlvÄŠ<Ê"xá+æÌÎÒ¸º;7tò1ÃL÷CÆùÔããÿl·d•ƒ¨¿~ž&HŒ½c |<àRx Ã¼ZqTÍc)?ö†¶]¤ Š8¨;ºæ¬¥JæjáÆÙägÓÐ oEj»%²}×|ë Å×%*³›Ôö Dà&ŸÒ ðÈØ<—ÛLx|àÊœôÛ‚y3¤n˜Ôé E’‰Tû°Ã’:jQM"å©‚ª—‘B™^¾}¸`²L$”0N:qÖ¬‚/ýH(«¨n$: Eá§U,ÚmOϾ¤h<¾Ë?’SlˆY:`Þ¸AdU¹!º~Ñ\EVhmÆ€ÚST¶ŽÒ)»mO&ƒp®K#¾-s—r ^Œ ò˜…Ì”±DîºÁ­µëšNÝ,†ënÁÓ=·P[„·>‹ßã“ôó&°9çFg‚zWXgqÛ؈ÍEÈ­áÖf—DȘ6_Z½Jüh¢0üCfíÎÐÛ2ˆÜÙüÌÉAª^Ï °ûqPp‰jN;t²nÃ, i½ß ü!,~´¹BO 8W •”æÂWܽèxÐV‚¦ s·‰¢èütßHEŸˆ~Ù@܆HUZƒ'êÓh0*A "lãì>B>wÛÖÜÂvüiVï[fŵ5 9tÇ“›Æ)10/⫘:¢*§ÔŽkt½’×^…Ǫp^Ô™8¬Üò2DÈ–'VJ¡µ¯.³Aõs GÚ$IŸ.—ìß1b&"ÿäH jïT•Ĥ'&äE"!âXôÇHEÑÝõ}ÅIÆð(ˆH„b=Pñ¹~õûŠÁÐ$ȹ+E “ü)96Ö`5]`?ÈôìÑ-DnäNêë, r}„‰X‘ð:NÑS œ’€lh{ø¸‹%ñܧÂû²„U|0‚hœ[Ê8‹üøE°`Œ‹ióuz“¢Õ^^~Oa oJ…£ /ÌÒËw¤g‹$lèT #+ ^\”öP~ߨq ëì Þ<ìR0KH›™ƒ•/;Ñ¡-@ÆàWg³f(´Âš…á1ú­8Y]2•Ñ\|ž,f Ï5X©WìLï'–jàÒ`AŰ6à§š‹+U „1¶ç2òÊaŒ“Kã²{Èf;—æPw‰¼| bxêk±ÍÅ4çcÞ¢>ÃMÇ>ïÒ™‘eæf‰sGtaâ ÁI]ÏĬƒài2> ^º‚eÊt£Sç{[Ï §ýÓ¤L"#Ä1â$X"ÿm>¿ˆc„ $Ü@þÛ|>‰côv‘Ë‹ÿ6ŸOãu(Z‡ÿ6Ÿ§qŒN'ò<ñßìW„a±_Gã†Ðïöá¯ürŒ?õèóoäF4èà¯üò5þÔ£zâ:¤±v‡ðW~y‚?õèóoäÆ;êŽà¯üòêÑæßÈ ÜÃ_=øåêÑæßÚºNZý>îõ;øap4¢ß÷è·qg/ÆmŠiU¢Í+ÄKmò†ÚíT¢›¿¬-ú ;Ý͸y6ß³ÛÛtõÙžÞ«—Æa]ÊÒ ª_ÉÒXÌšq=Sw3nÁÐŽ ·é~õÒ8Oµ,Ͱىm11kÆõ@PLÝ͸yC;‚Þ¦CøÕKãr¨eiFÕ¯lú­ d֌뙺›qólÖm··é~õÒ¸°Yšqs¡Åˬ×3u7ãæ íz›a“¥©D3 ®f@Ú½E’%9Y¢gà’ž>¬„¤Š`Öd€¬|58÷Þ`õ{£¶áNø^`LÊ,¾Ç]g‹)Ø¢  )ë_¢Û4…háÀ¼xÌè··ò\[„'®±˜òûÚøáb¥µØ‡%1¤a´ÕÏÁš UÂ÷fh0ö9h´ŠƒzM-tÆðÃ^ä½x¤"ÅŠìƒ]ðE–ÎûéÜÍhe‚à5¼Qð$á¬ï>$ÿqá2¤SLiÕc’çœæåˆD6/¦õ¢sÖB›€-_àFœÙ0f¯@…z’8é,¸•˜ÊSãø)èÚ–:Åøí/“T<£Çš=-ðèå‹i!fT¬¶QîÉ äሧXU°^˜¥Eï.&fwbŒædµ¡í©‚¥’æÉMQha[U9–ŠÂº¥3ê)R=éÂD'ÊEõQpÐò¼fšZñÁ›Vÿª½#ÿ¼´ÍŽ gï`UcB'ªR–ò{òýF’î«O•Ï ©Áƒý½Ï¥%¿[¤ÍûÙîæ / ?«Ê,9nŸÑHÅ`<›lÃH§~‚ªŸI5ò÷Adzc²š2 …gÑ&©ï¢(RJíe×Å7H…ÖÁÊ»œ-þÔ” ÁRôÜÅsa³t$+É)ܶ  ‹SÍ”Öþ ?‚jfö¢Hn ¦Á05WêWÛ×V¢Ú#Þ‡£…GlÐ ÏvÈ Ë ¡f‰ó‹µÑ#"®Äf,×±#+]èÆoN2s6‰…œÃ(«‹IðØÖ@(.ij›Ø:" {ËÆ) èÕ%„¥®‹7û m’Á¿oðïoñïK=qˆ—3ŠFOiMQkñ=d ¹L¸íÓ´˜,² Œr¥¯#]úÚ¨³‰¸4`8Üë_ ¸/Ì1G¯ígÎŒ‰|–Íxœ¨ò}KcúÚj1ó!™@ñA6²Î0cׂ,âå…+‰™Œâ±—¢Y6â&«IXfòQ«Ó±†âqë‡ùeü?[ÌYÔW±ûJÕ¢!6Ùê‘ýÚí›pÛ[P´E8‚-Kª´ñÀJaVU^eÎÕ¡¥Ù-n ÁaÏ! Y¸Ht}2‹ë|Q²o£>3$ÑCÄüp›¸tWÚ´ŽÏǸr%‘hŠ­YXIÀÖNih‡Ž§>u:¹Ùå÷Yz×já$a‰»Ç:õϨ"¾[r/˜ßAW÷z-ªe»€ÜæAþ3±y&b¿#2Á1wºˆ9Ay9ÇrŠJAg¶û;–‘ü òo­»ÃÑm²Ñ÷(äñ)ïmìKÄ{5YoÀ´¾®šXª·rëÍŠ¾´wÿï- _3Sù¿áÞ¦GR$± I¶í8>34É|8%©>H?”GF~ŸÿˆN{÷Í«Eú^C ™/ÞÞÅçùmíÅoða¡ƒK÷$å`ÞÝû™yW”mÁ_\E©°,B( ¿ó:»½eŸ8YÃZx:è¡]d5€Xɧ\Å%‚‹¡ ¶4‚ZVÞ3 JÖÑ4Mfã[B§‚¸@@Èù%‡?ŸÙó•Øî‹ ËÓšsòyQ‘!£† HÛ‚c{éB88÷(Õ·H#U´jVcd¯ã‡V®dsÛk/…„¸ zÊñŠÑSðüˆ}("ϋצOšâ`tõŬ4ìŽöFý^¯?î÷÷Ç£ñÁ¾Ñ†ûCûý^o<÷櫽ááÁáàpØDý‘ý~Ôßïöö÷‡‡£þð`<>ˆúcûýÁþàð`8í zðèÁÁ¸o¾µQÔ—l½Q·?ö{ã½Áx¯¿¿gú˜®ì÷ƒÑ`oÔÛ;Øï÷¦zÔ?´ßÇfˆ£áØ<µ?ƒ‘Y)ûýhÐŽM»‡‡ãýáid úöûñÁ`¼?Þ;š9@ÃÞø0 ì÷{‡½QßÓjxËæš›Æ†GQÍaôzƒÃÑxÜ;è÷zÕÍ4GäÐl÷¨hVú ²C昛&úf#ƒÞëìŽ÷ƃ¾9/ýao„ŸP·ÞŸé$€£ªaÄΜ‹õ2¹ÉØnnh>o¨q•cÚüëòä’qíÆ­¤åPóõ*º”ô¸õ¨2¬!Š[Þû™ XTFb¤™å,1DGã^wïÆÛ%ñq²ÓR.^ô5¡Hƒ‚ŠVA,Úi½Ês¢•ER–—î$AˆBô$¬r9ÇD19Ï$´‰Ô¥oÖê¬H Ï l2\æ‡I…Q›GŽO2p¢š%ÇÃÜ·ãþAÛRá•ç†æ¹QAðNPïœKþj1S 3Q@s§“•ß"È ×ýû)>7É4Õ§’ ©š«"`5Ã;ÜbÚiSy>ã(zµ|˜ŠäÆÄHíM00Ø9±#+=IQÂx.YÒ5:68ÛN°‹EŽÅîçùm‘7çæ½3?‹{×yêœDä>².bë6RXwÑ~µ…:—Pí¾ùóÙËWoNßìFWØÐëŸ;ëtvûsç½ù‰nxNp õÓ5gøì?þj1ü]àßÏðïçø÷)þý&>}öÆüû4~zòüôÅ›ÿ° ýÕœò—oN^™/?˜ÿfñ«ãóoÍ9ÿ‘ÿ!ÅáQá®FP ;\B8£¶d²3™p¿Ý,¼¼ nÜ&l&øN²L™ 6íøI~{ʶÑI'F&Äþ ­—ï’ŨØRLfIv#¨©e€RR@=™ƒq-/X&Š©] rÁb°«ØÌÛ¤¼–ȕь†ö6F¾€.—/%)pÐb€Ë“\äõ©3e(óƒÜPý¶×ö¹“ù©‹*ðæ 6Ù«d|“›ìïÀ`Rèß(ª›ôŽªu^ÕŒpÔ„( Á8̹@ð•jœ›œ[QA+’ÞÖÉ*YbϬѵHÿ¢Fô21†·XL]“0…ƒxƒÀÕîà9Û|s|ýó£vÇ‹@£q<‡qÀºo>ŒÕ ì¯Ù&§ýãØNalví¾[NÆyðv½Á3ãBk …•Ѱ`DR’•B˃ò“hICÆè€”[¬ÕZ)’ëRÜ&×\èJ|8þ§0~÷Êcâ ÍSZÝ›Œ 6ôàñóÐy%jÆÿÆOÔÚmÃcàeus R7v'«6KÂÔÌJqØŸ‡=Õº¸"6Ò¹4¿xŽü€4OvÒ›Ûò¾ƒßðÜžæŒñfRøš¹”yoïI=òN™?NÎï½fs¢­=fM Óg˜f)E95ˬ-D„,É,…žr·µðIƒ œâ5hÛº†¶@ ÝC÷Èž(ðèàÉ÷ð$ËúaöÞžf!+Á÷ç)”A $‡(z•¸E½*°»oÍ#dr4è†qÈÁ¼¨´^LhLAôNúÁÇ´°fÛ–tÇsam‹„b㘗ÍUÌÌ÷ú‚áv÷ééñ7g/ßœŸ>ai¬6cíÁ”ÂL caPvïôãíÁx¼#Ï~§Æôp¬ªLb¢¿xÂ]¸#jáJôEO‚ˆ¿DH;kÞÔEáÃ'Gê5–rú,oÀëÄæ›½KªüèOO­ëÓ$°W2Ø•gUõCóCG…Öd×é%Zû }ä;¾Ý5Ql5zÉAüÖÅ`ÆE°ÿÐÕê µ( CW­eY"¾Éd9Ÿ z§£É#z Ò«8òqæU/Η ]øLöÖQv‚`&—œ…•©,x‘‹:cý/Þ“bq^óÍ9£ýS<èÄ?ñù`#À9O›u_EänÈ¡u™¥T•ipد`¦çšè£ú,ULܨŸXÛ=V“wpUGG‡£^Ú9¬Müõýþ`p5O7K2ÅUZ]ûÌØ×lÁP7¾&4ï£éÆ×8܃Éâþ®‰«Oš¤ýݤ½¿µ4ìï¸;íïõ†ƒqÏìÞ~}MÖñèp0‡}óÄf9¸J.ºñ£W{O·³&4ò£ßׯ‰àW†®ñÊ+a _تO»Q:_¶¶ƒ†­Üë÷ÍU F£aÚÙ«/OÜ똭67Ì<±z•d–¸Jk¢K?z UãëBS?ºq©e‹¯‰máWF®ñxm fÐÞßMúÐû[ÛAÃþ»ChðpÏ‚´3®- <èõ‡£ÁpØ®Ýß~_­ÒšèÞß‚j|uhðÇ·=Tm¯‰+®k¼’™„üìjqÃvµôà¹Fd ‡,“›ÿHÇ«©ÿìj¾è¹†ÒC«Ù‡×ñnà?»š¸ÛA®£èôÐjèw¼’¤ù«¾†Dɳ$Kœ6¬•« õ[èºë4»Qø/²ÙL²^ágˆ'Xjîáèˆë–P`0"M¬àÁðV[”þJŸ.ºJW·ÙÄÍU~Šÿh½s)‘SP|qo4ÐEnh0yM?lº”Ø¡‹{=£Õ_$Fųå‚*a¦A ˆûTÂÈKv!EE#ªâ“8R‚I£öÉ'3¿~‘Rßè:]¡¿Ù´!Û4¶Ù¦¶¢0¥—Ó.¼-FÔù¶q\Ñúb}Å|í¼·dùnÁBCéÄÚpo‚^ ðZýNË&+Ú¦$ «Ìÿ±…Xh¼{¦ñHsaê ö§½`Ø’´ræ1ny~‰øšaå8t£c@e¯ê= І÷¡ë>oÞ@¹Š.Œf©wX!Œ˜ÌÞEF[å'Ê<é^zH|“”“kШÈ8:~Poò ˜Â(ÿ«XX¼)«Ù„ÇÅ›²„ ™àF¤û¿” ~ùOÀã¾ü—ea殉ÌGÑÊÓÜBÀ¤öz»ªé!¼~^9CNág‘a,´P{4`‚ç’"–°tºìÅÇÀ*û8f•“kÿ&;Þ¨ p)# ®žsPr¯AêÊÉÜÄÛðÐÜl¨à©*º1ï,îÛü|ljçb`†„o)V)t¯ó³†EtâB}t¾k‰VÐ_x†ó°S¯p¿ ³jwÈyÇ,„Á)…V ©†š"vï"½w‚BeM²’æMS3úb’,¦zc¦T^È<ØÖ[B¥¤ö†ðÈ9IÜÃþ%„Wëd<|+ x8Q4e”'ÌÐðßyzÅ^éÈ.¼òÊšê|½‚0^…sîŸ\@$(£eÒ"…·åªÀ…%JZ‰¼¬áìÛPÆ–ÀƒlAL˜.'{Ù›¹5³‘œ‡žÀ[2ï`vžu“@„_—ó‰ ýh™­0æÈéùÄ¢ÂJ6~ q,':¤¥ë.×nh† ïÎÊ%F²3”3y™Õ®ØR e×a¸ªš >Ð)o|äCVHf‚9å¤wÂÿÏÛ’+ETÉžµHí¿…0Wv‘I°ÊBµ…Zúe¥A>ó¨e¸fÜŽªGYP>Ò„cA7 ª£ÕäÖÐîHHi[¬Þ•â´fÂöm¹‡R-çz´4V•¢D#6— OW¾¾\¢'Kà× aݾIîU*bìXÈn…v¬ G·@'f  l¶98pYXžÉt9W°{в¼ÒîñìRaCØ IišÉKCwwT’†]÷áPª¡¸?µ"›”âi)æÁ•: ×RÂ3a§aU»{÷·V0U9:Øí‚cÓâ¨Gê#4ª2Fd_š{ºœ@ˆûöÿ¥U¦óÖÝ­tä(¡H+/õ/ áé6’YZP@sŽá$¶íbC%û¼¬BwþކQËzp9ÕÍ®/ {È‹4Bf.R Ž¹„ç*\–"^žœT£û´}AõúfäÂZË…Ýúˆ·¾4ÊjaP·Il‚Œ™å“;Š–%E jíÚÒn ðì:Ën vìªÅn >ì*Ân ì¢þn Îï"ûn –ï"4tÔ0«pÔÁ¨T¯Q€'ˆ/ñ.W­)<B¡ ÛÖÊš´gÍšfÚÊÕ|‘Z°ñ±Ìw“øb93Z¹TW¬qõ×G»9³ŒT0P9eăŒ=:Ë$ZÂÒ,Óå$Uâ-gß²%\UÔ‘Ã[ÐÑý®…4…+EÙjG•mŠþ4ÏÚÇCKôê§Æ+ŸŠWö•íîoôÔÁʧâUWgU»îB­|ª¿ò©xÕE\ÙîFû3X·?›toWC8²dÙU±*æ^Xð’:<Â:߉ð~GãE^Z ¼ðœ®±G}Z‹ÔǸU>Ú±ò)]+gWúh÷ʧt°|œùé£,ŸÒÍòqVª³S=ÔR¹ŠÄV"b|ã$”ÌIGr#pd!.¬åG "2I;ó\)+Äch3ð¯^ú6ê¿Tü¦‚”YJù«ð• ¹Ð¦æÅFþÁ2BÚw´ýÑ ÄÂò‘ œ8«­ýŒÍi)V;Jfà4ª.zõŽn¤Š–`9|$ú­ŽEÉPhóî¿ä¯J|h ~96³Š|Rçè=qF¡•¤\¼ÈìžïTv<€M÷ΡJ96œ0ð˜À ™»éŠÆp9(›Š’âÏ¡C%uöâÏâAw42ôªuÆøÛ`¸ghmÔáoWu†æ·~w8èûQg€¿ú£Au„¨ À}$Ô36/ÆÁÿ¢>¾ËOz y}øÝWZñÆêMcÙ3”FZyñ¿>ŒûÑ¡ùEÊ=Dýþf˜ò`ÿ ê÷ñ·aϰ)úL¸ö ¦Õšiñ bဃø™eÑ\¦·c ¶öƒþœåå»iz a °5j>ŒeÝ{2¥X­¯a„ÞšÆjÕ çqë²wÅþZÄþôc=›ƒÚÐ铳§kjÖ€™b€Ôþ¹ŒépƲ(¶L,‰ìoìÿ©]2úflߤc¢_cvh×VV%l½níéa»r`ëZØg脇­×n"~^©šÖÝ%‹ëÿTO6]ù_µi;™ÝÜ3µ“‹ƒÉ³6t¯5®›mªaWâp×6Ÿ™•ÆWŠ=÷Lí‘‹ƒ#ÉbÛ¾{ˆOMÓ› ñÀµCT*ìþÀû~Cø¬ì6lÞ3‰Ç´7;lZp7?íÛ׈Ö5¨6ƒ8ø#8*6YNl¨4Õ=ªJ•!޼ï+!ð5¾2²@ù«HÐDâjEh"{[bÎ'EkE/-I”èȈc¦ªå51ê[W"Ï4XCYm€"-î*úúóƒéëÏ+iç*ªûóJºøk©î—¿Ó×ßé«mçwúºé3ÿýè+B¡=UkÒÁÎT€&@ˈÆ*ü%Ô»Ù.ËùDø#¬Gˆ°¾£‚Ú}ðÕD2|÷ˆ=ƒ{g¢Û{m£Ô:<˜!z>ÍoÀ0œwÔ*me$«æ Z‘E °–·5BöYzW""öMZ^çS[ñÖ É×ðl!p¸£µJ ‡Éh¸³ÝЏ1˜ž£çrž^Qz7Jö ^›°ªk ;†u@oO]—&âx…FjT[GŠu²Qdº´!„x‚Šã¢ÎJR¸S¢@¯æº°ÌÝ€îìm7`e»ÛÚ XÔnÃMØÍnÀZvž±ð‡ÕÍŽƒÇö‚ß÷7kæ xì0ø½øûÁ"„N †nšÖ¦Ù£éké²¹$uÁ{Ü,æT¿ipâ`²q0¹881qpÂâÀ+dWÏþ>~y¿7[\XÙËëEªÑ›Ó9EådB剚ƒÑ=§ŠD`épô$jrKbÜ{ú µ[ÝC(;.”£tˆB0„[<¹NÁQ-ÁVYAT*³sETCdsÃ{¨rO(žsoæ NS7ÑPÄîÏfÒwøÆz©;|c½´­ß¥ìºïê܇¡T­¿Ó_4ÝbÕF¿®PlÛ.Ò°î¹P>ÛÉõŠ1ŽëÚà°ýà2ï×=·Jh %ܰý€8Ö=вaA靨ëF~@„VÍeå9Xq>üÁ«ý³JêŒÑ ~G 19«l›‘î±RYoWi"—X¿™³˜Æì÷ñ²hj–Åc3²­u(®„ç=dFÿ¬ÌŠŠrt×ñb­¼Våï*#†X„ƒ ñ‚ÑbÄÈE,(o |šüH@ I4I…€»'tô AïF ã©-©Ü6yu¾GìA×3‰#s%ýçÂN)öaù Ö%\†£aÝäV¤s'g›ŠŽ‘¶¢||6ÞZ€$]ze†„³ ø< ’plóµBWö¸1¶d®š1뽞ΑñBñ®ùe;þÂü sìào„©z–œµ½Œ,,s†’ý*´wOr3â…-†á‡_ª2GXφ¢¢rgdk Þ^°_ÏÏØcM‚EÔ?tY8AÝ”ÐNŒ‡‡€}Wê®A¨iûº ÊTGáãCŒ÷ºp{tϱh2׸/ÕoÎNä ŒÑŒZˆ:©‹‹%èwæ„zž$Af‹h–_%X4©ˆÀæ¥l!|¢A„XÙê“~äýô#ꆔ!~¢?Ü“O쇇,™ãà¹|5ºéá#ê”3¥ýaÀsó^ñbÕ8µhÎjlfÒ]ø ˜µùÓí»aÚÝê¼Ûð˜šç>ÂÝÌå£6?yˆ5°æ5Ñ´“±¬‰oä]ù§–Ù±°îr8êŠÈçþYÞ«Y6~/81aÕµÅ+Ï¿×l}ž¾ð½ê.Ù÷¼3Z÷ž¿•ú=w’›ÞSû]±rÑN×Z¹h÷·"„[]O)˜S?$¡†õ)ÙKCùf˜c«݉‡ï_%ħˆ‹Œ+&JB[iŠ/ÎÙhEÕ§âkOAά~,rÞó‚+€Ì윖ÂJ¶ KÖ"ÿóÅÕ o ôàhíÆÁÿ>)ýªR˜ˆûõ0© €&ÕÐÄOôzø‰>ÊÔŽ>¤{ø‰>~‡5ã b\ÊzÊ#ûªžP…H|èµÊžoV‹_ 6¶î5oEéµp÷ë^ó–ÿ­ýN¨­òŸ*q ÷>^G›*›l_[Iš*'A¿ÖL™*Ç%^û§vo«ôŒÏO=A³gÊ5,1UCÔmű«Ô‰dbÏS“ðêÒX2'¢¶%a6‹ øB) rDµw±(W^^[‘Ù§IŤoé‘3ÅG°'ú(ã±/à‰;”x&Íg'á#oቊ®2wÄ<çƒ/zøÜ‰Ûå=nÛÂCù̱Ó~¯Jò$V®æ’â•èõ†n"þÝ‚iø×&œö^ôEp¹/¼áÇïpCÒdv!†õ—"ѳû_+Ék•mô_­®ýÜßéš×üs Ÿû‡¡æ5o•]oÞy©¾æmýS=RÞ[5û…WO]µ7SÝܼƒY}ÍÛyýš>»î™/›hó®~¦F°š4HUF’Y!%ö¹€Úd±ªcæH$¤m+È]ºŒ´X¥{»¬º¸Õ »£ñÞÉŒîwCü`„¸$éß—ÉÌ…BN]Ê%®5ó3ÎÞLÌXú­£(„s8b¦›ÿ´ÐÚõ£ωwé›AÔv÷öÔéæo†¬®a·ƒk< N°mÚV¿1ƒ>„ö¿è×~؉i‚1wh¯< ¹)@›0Vã¨cÔ¸rògCCoZ/þ­yÊ4¦EåßV¬Kå|Ó²ÔqZªÆð#4Wa;E!¡¨N5Ì9¾þØêí"-Ë{s%Óˆl`\U¹‚¤¦EèPìC@솒(Ò$ ÚƒÅìiZçŽG/X¨Ú³çƒ0 Þ!yÛí Pµ>¢ªá„ñ©Q…:keÃ<6;8“Ýðà4­ÈGœÂXK9+MÄd!'C(S7®Âé'\¶¬(…&¦yn³´‰ }›ßA¶q›ž°ìdÎMCž«jP„®E>CPlÃ@C°…œ$™Œ*PÇ iª 0)Â-—9ã—Cb?&XzY‘ æ¼TéæGÐï^£™Ya }óy _Pö…à»ÚxÊ…“\-È9!XF ß?„îòl¨ª¢©ˆÏÞ¾hÛt–Ò ÀìÿŠû’8=ëpϨ¸‘y5æRO泩äÑTjC ~n(-v · U"†=½=—˜­Ñ~Y.kN§‹ˆê[¢1@êËò~¢˜Ž£†:,íXd÷%¥‘Fz=~J9ÕÀa¿}¾| :R†uÙ#Ä2Ä Ù˜P¶ßÌá!OKçÒÌFr}\ðŠí± äB¤†ÈN°-|dwÅ>,È ¥î‘©ÅDÝÉ\áJfbT ?nnòyˆJa·—õ¾ÞYu.;fŽM!£DÀöah˜Úlk¿Iìæq™Ÿ*Àr“HÉOòø©b7 BÜ šð¸òÏ'ï‹ñ²Òÿ·åœªEZ¼VÍz lA祃¢ OÛ9zÚŒŒƒ„ÜÜI*±š(?%–öŠIéj)—Gˆ.´`†—̲«9Þx Ð¦Wè„ÃAü‰Þª.æ——g͇µ¯–¥Eù:·ÓÆo…¦Ý˜ˆü`¤’¨6,”LĬœSÀ Ô£h+&wUB–ÚivÃU½™Ñ¶÷µŸ÷D°TÍlJµÇF›INNšdŽYÈ÷½mA¿#Fñ¨"Ë’êXg(†b#ªÊ­çöMT$f22 GáP@›AR'!áÛlé-žÄûdÑ1,¶POŠ“”ÍÍ~—Ì'u UºeA˜ àæùT£@õ»`0´–ß.à“sV$Aí°t7‰g†qØ"DˆçP×=׆fCþ¼Œ2[þ)1›9%¸¦dv•£OŒÆ+\f0_ å õ¨=f,à)ã+…8Ð:ÿÂIm¬Ì¢½j{«‰DÙrNÇ«0Üìðšåj ZfFËëj¥Oþ¡½„‰g_*M¥ƒË†Ð\ ½á¬â«E¾¼Å­š\†gUfàR9(«œ nÚ…(qÞßÚyczç)–´¸VZeÂü”a·àØ"‚¸WDFœ>Ä Ðà§pË{.è£ù `HèW‚݉ð9"î„ØB~\Ñ’'b.l:Åóî‡ D4ˆmÛ\lÖ’,‘ª¤¶a2·9Dð¬¹/ ²ª)ÖyQ%]¨ÆËé|š~°^t [Øåо¥Ì”x@v Q»b•_# Å…*jd$+CaÙ øeöÞÈ¢7ÙvRîÌ2#?çÛÓ¼ÜÉʯb³I¯Œuuaö"³ „ÜòâoPé[!o–*u.…c,”°‡%*î‹2½±‡W ¿±•mÈåµ…yÛ¢LÚqE…Þ?É2$:°/I¼7ê\d<êdk©ýÿ9Æ—iÆ ›‘) U)læb™Í¦±c´Tnˆî¹9‡(e›öºM~‡š±z¿9{¿xeŽãÅ"YÜ𠩉£$¤–¥O2ÔHGÙŽGª×̽ 9AÊuµÛv|*k'JFA,xy°îê Ò®EÚïòé‘=¶ –ƒ%–ަ¶,a8"ÄÕ.(^$Ããeíô{ûÃýQÿ`0jÇÝn·á>A²À[HÖÖé2U3 ÒäM’âqøqí¶š.òÛ[` Îi:ÍhMI÷ĆX…ÈV*ŽfùV€Ð ç/–7·ZYakÁ=Í º#Œ"2Ü-”ÛûigÐí†{£Þ=*˜B<-¿f[¦ÍúL_Ž@U£ec^^æ9ÓRÙ‡ÀËÚÖ­$ˆˆ\7 ®zìÄî³0Nägj{m¨‘Ô9Õ½Ô¥Ø-J¡x–¹­|(O/½J 8l¸š\ÊmwsÌ)Y€nÍguÚB³Öd9ÉHžCîdxÅDƒk\¤ \ ˜äÉ•îHñõ}N×—m Zx›¦føÓÄZFt,ýpmÄ’«ùÆ,%2ì=qS? ìî"™Ý$W󬄠¹~ïÿÛ‹{>L%’£ñòÔUT0¹¹7ôâÖœø6֬ÃOç‚™.¯q‘RŒzQ˜óõG¨ óíO8 |ºÿÍ×0×Ç/Údš8ËE¦ˆ¥†›·•,º}s„”«š‡ûè¨îŸÎ‹å¥¡0Ê´Š”>sf¶œxëÇŸ'|ôÔÙœ°cäðÅ,O¦ò/ê$0죨þaç6 tŽ„É0p“’·è&KÂC[Ü—ˆf Àã€\ÆõþÌæM~y:¡*zÌ} w±áÉ\)¼æd–™¡ò» [H&ó7n5hdNhM¢LÍ~\ÐuW2Ó¡©\4ã»Óóo_¾=ÏþwüúõñÙùŸÿà€œß³jÃ9º“ŠŒØí‹“×O¾5/}úüôüÏÀ.ŸžŸ¼y?{ùÚ¹WǯÏOŸ¼}~ü:~õöõ«—oNº¬B?XÆ‹IJ+ Ld±>“2‘¬ {Ûh3#{¬xe†vað'ð²VBí‚ê5ƒVAGðí`ïÂVP:€¾Žâ4yáéDĤwŒXŽ ÷ …¡ÃûÃÇX—ˆ¹Í!Ã8RCªû00#gƒ !!Éœ’çO’êQòéÀc÷ˆoÊ#'·“Ó*ÿ¤û¨!VUàˆÂ Ð Ð]A¯«4•È©PæWB™©ùcGž™ÜÆÛ¬XÍ ˜&‘âeçu¤=C”äÂŽ“AeÌ´¯Í(…Q¡kñ|)Ê꥾Šîj![-i±ÝžEÅ ¡ã…E0ÂX’dÓyϦ7ýwd(hжmËkƒ¾³Á¼<ê!9LðÝŽ› QÞö ɳGf³zùœYøñüÞhý$ óô¼ì©® ·Z`è€ÂPÝVrA`²÷>êyâÇ ·ÝŸ“JÉ3ÁÁs¸ +¸àð=^n–Xhè žÆûÊÑl‚™ç¥›Ïóœ€uñSÈ{DÔJÔE_yïÕï­' x±DÿÎí­Tœ Çžªþ D:æ–ÛíÊÉq±Š:Ìféá„ᇚ]ºá¢ëC`˜Ú¾á=GŸ/;§a¸6$‡4¶6A—6Kî•ÿZ|‰¶r}˜çÿPŒDPê¹ÔèAèKK §‚ã°°RH50ÎÚMnRé °8 „¸ç -iÜEÛ]{Ú‚ûj%BîÊ,¡xP|]X]Ѽ,äüÇ­?˜‚ìp¬ˆ@Ö$Z: (C`ãÕ×Ĉ‚XÈ…l¼ªÌkr–<± Èš¥?oY_–ÒˆâíáxGm…ð;Ìv2´N Í‘¬FÌWÙÂÓÊAZœi%YaÊCÙ¶Ù½µ?˜ïy?I5‡³PÉ\ºêLzßRJkp@¨1ˤÑÿ†Dj¼X¨Úù>¦@é4œ!»ÉfÉ"Þfá¾r8pš7äî›aeiÞÜa†qƒ¥–ñ+0;-(%^ Ý`Ú,òËòv¿_‚v=ç®aÚšäøeºº²;ª½[Öö{ãöDñz‡³+åÁÝý7ä~¬z¹]& ©^½N+V‘qMûVôÕ´<´´ òwWüø@xÓl=òôë-çK±Æ~aO‘¡°ù< &Ú¶\Ì ….ŸÄÄFã9é4-1æ’j?§Vêç'éÒ´ÕVbž±+p¨;ó%lÖ½ËvïC¯·ãªLÌR%NЏLw²ÇäB:‘ЬeÚ¡H[„D¯D+†zT?”ø÷%þýž}H?,Z¶{ö:h4¶ G3¤!©D —\Ñ"ˆåÅ&[©Y_¸¬ÔzÝ/îõpmâUµ•úŠ´î2Öåâ£~ÏÈj9K?pŸ¡ó;» Ô rFÄÂê»X Bùë Ïšê\1_<’:{<ÍÝÄN ªßzË/ç¨h±Zr‚NU ùa*zÑŠcõf+)ÍKóÉÔ£ÙÊÍË´J(Ù#;GñéŒê­˜3ó#Ox+Èà±QÒ§ :þ+n’9„,‹[€h3‰'¤1¤‹ ˆZ³‘8¥Ëžvjd6L€{4›õmš“EvÁZŒ’±¹’Ž˜€Çk‘™YŽ»¨6ͦ,¢Iä¶T!“ƒ× 2éBv¬3À56êöºdv?„ÖÁDÕe_ŠÕ—ݽXç`éñ@¶<Í'ˆF{ô<›¤s° 8·êñ-WÉ>ÄÇk^ª&‡4ý‰ê#‚þÄëÝïÛñÐ ô=ÙT½Þ5aÞÞS~âö“ø @÷z}ü{€ïãß4Ð7"¸>‡«Ê§ó “Û/¯ËòöèÑ£Ëâ²›/®IAí°'A€0/KFúš˜þqOœIvì´|ÃeT¬¥–ù1®ácS¼ÐntÞü;>•½nüêõÉñ‹¯ŸŸð€@çðÛ4/;ó$r…å‹<ÿUI¤Š|8Š…4V’ÑÅ[—fÕ¶œÀ7§þàÓi~sdåcpð-R2ËçdäHGnäǽ3ŒË-YV¶E9`Ñ…µc§•i‹YèYº˜J›uÃõç€:†ðF§ L µBˆeenžÄÒtJâäíËÆp‰ÌÈŒ³È`Ô¶dwFUOÛ€dvM̘\LK4á•‘ë Uú`£tÈûªÔ–&ñ¨¸_Æ[°†P jK8+×÷Zb:®dVɳ#»­7K².ßéì=Ö(Ã=òª«âfó½8-Yò£bY¢Ý~“ÎÓ…99¯`µ&ŽXØl$–± ëåÓŸ‚üÁhoسh”2}>ì“þGžƒ8ç=¡Ã^8úç5m®ZJGÞÇFHL±úpêˆÔQ#ð+‘±+ài•N)†Àj\˜J@ç¾b̧ítxöv…7H)Îwhßã.ÿ ÁTª 5øýá²û¢Ó¹0y1ÙX8)*r¾1ÞoaAD€äø“2ÅaØF¤2*Õ‰3,Å7Ÿ†·Ë(ŸÙ-ÞNAt Zš%:1˜M A剈¶Ôa¿¿zõüô‰ø¶ŽÏžÆOOžžžŸ¾<{SwS¨fR@X æãBóxE8<Â(DÙò¦­vGá]pMn$H’”°›kŠ )&N°rû=ÿž­‡v‰"¤Ö@§8†;¤6®ÀLJåòÅlÚ {³ù}2+ï;—„¬Æw͈…|L —~¹ÐFl¾85”-Ý`,h Äy ‘ dÆŒ+xÓë[ÂÖ·àêvÔV2<&<ÀÈÝC]ôšÄäýT¬/¥35!ªÀ£w1ýlEnËÈx[]Âa#AÈI3BA2©Þ~ UHýËš —€ö#UV°Ø‹ä›ÁòZÀÈ ”0h]ÜîÎ’;!DÇñÖ ddK¦ôÔÒS.Ž{O=ò1bZ@íØgÑ#V0–=Æv‹þ) Ú ÙÚéq ³pòEÅÊ)*HÑjÂï3–8ªÀ’€e ±Çw¹0Sè0y(èqo7ít˜ëdÌ=H½uZÌ"%q¿¸În=}βØ»DÞ[T›Ï½ß[Æ ^‘D&d e`}[Z x±#¦!ºÔ°46Q|âœÆ—ä¿áL`y& /õ%ݘ3¹MeÜ3˜Ö‹Ê¡yMÄÅ¥¯5Ë0ØÁ¸²  9ñA ™~Ù7»;ɬ”ª^¤Wrì6¶bhL™K™Ñù< ‚Þeá$z#X¹¶•« 0Tº¶»Úñ­‘xò"7ÿLàWðèOˆÜ泌×1·EÎ q!¾7]%ÇnÎß) BYy=Š-Ò‰"«²^^I™•3¶)‘° Þ„†iꎅäj7mßX¤@~ Êja†mO#¹BRÄ Zªh¹5Ó'rgœ™2œÐŒ)oŒ#É$ÀM-yö<)M€-ÎnŽ0E;'޾vIèŸ~Œv¨Y‡P`_µCΦèM•ÔÇêûÖݰ*ÊóÔÛÜ'p‡âss‚]EP´aŒ\|°Ö‰F,c!»ù I’jNÛ×ÉäGý™ì¨ÇMÅŽÂIm„½ã•½ÀìDPK šºÃq¹íP¯ øE¢ÏšƒaËð\R•8„_tÀˆ¾ ä„rÕ¸Ž5CωY€D0v4N,lEò>Éf ‡ÕÙÛpŲ=±mN[@T;vž\¢¼ö>³±9S>œ/5ÝøÉ,›:XP¦r¢ÿÛ'G5ÜAÕ€ºÏ–ÝfÒ™¡æòòm’aJäîõé"ß y° é|šZ{Š#?Ä}·Ù5\37²ºÁ’Øt6ZÇ’YÖ%±­ɳgÙÂ¥Å@§àES“›|É©RTãžWGvÎ2Oÿ !Z!ú½¶^Þ&f[rÙN$µ!·#°O8=<®‡+ˆŒÈžùξyrzꬼºæÊƒqMR¹°Õvü<9O¿÷?£FÞ|óâ9,ø÷æ²s&|íÍݞܧçO9D‰ ÃÈŸ§‚è|´2øöüÅóvüÊИ7“Ev‹›ùêé3_ë¾^ÁÝÛÍnueJ½GjÝZ¼:û¦ÿäìß_}ÃÐjWž¦bäi™P¤*~GÒi±pŽœ®¨”ù6 ˜~§ @5dW¯!*X œÉ?®HÌüÇç³ÂºL™âé5o»Á”.°COÂØš–Z{!ˆ™³ÜkGMì¶à\/œ­Ç@ÏA¾‰_™Åß"êßæ¨6­•“¡E!CÁ˜^éì’ eÍhÝ"©Mxúi:¥ëz-€B^A …Šì2[eHo2óU}t#…Ð(‰MýqC!‡«¶Fes»ùd)b§Þµ$Ò«y$4ð6¯5£ƒ5kC=‹ÿß·Çgç§çv¡ŒT©Y§exšÛv©`"p71Úª‰(ux‹Ý«ïÑâ°½6/"æ[ÔLñD;e` ®…•q<3ƒìKª†ÌåEªOO6ç!‰€»€d¸ÉÌÈ"3" VȲÖL¢ZªŸ£:«ÇþÁÔ…šJh‘§/Ìçô0ø›Ÿ’çNÍm2Ïš( £p’ úGi½‹Ômë?PC¤~Ø,Aã‡ÈFD(Ïn6#sˆ•³œ¼‡pv³{-ÔO†Õ®:Ù†Àu±âj>×÷ã=gçJð~—"2ÎC’Ìyåyã-}/c°!È)㕸=TšP(ΡÒf(BAòBQ¹¯mȱddÚÓaäd°"Îê(T\0Q7Î:)qçFPü °u—ç†éÍ–‚¿DZy™Ù<;>Žª.ùíRU˜ƒ‡Kƒ% ¶1z~O¥5Pùêû9xœ6ãÎ)äl¾ä<À´ à'áK&˜¡ÚI·žXønÖ4ùÖÕ ½À’S…Y ªš×ªâì3Ia‹Só†Ì=Ê™H>É[­9á£è&§€¦Î<-Ñ…$Ù›fCBÌŒ•Tž=Ü!£;Ø@Š^TàöNó»9flêg:bAðšëUæT‰c)+Qs…À‚?Òª1T|N®ŸƒQ˜Œ{)n]b)#F"3 %гŒémÑv¢7êgî°VÔJ=L„ é@¬ «aèúr‘*y©2;'•q€àn[Êzbü†øð‰1ÚmZšNf𥤫ò@îA+¥ôÒÆÁAç¡9ÿÜ;ÛÖåB¹€„âßÌ혓|‘Emæ8_BVU2â+‘§lò6=‘e¤nŠQ#êѶBi äüsUžߥ˜R€ð *®‡PîY¦ …磖Š97pžHn1d9„YåÛ).»Káë_8ÓQ7~ñòéé³Ó'Ç:T`•XžÄ¡Ÿ·žšÔúÐAOÈ€‚ôXh ¤t+õ±×ªtL}8µÜ—íʼnG U^¾4GX,‹¼ÊŽÚt¦I̱â°w›0-_z¹‰J_%€{ èΖ¦¼(À/¡?äàîÖ¤“ã­Ÿæ,< c¶PŠaµ¯#%xÜß6XÉÙÇ SšO…ñφ<Œ¹áG‰(ìŒ Å//©ØLˆañ׬•Ü‚ÏÃðNÕ ÑÜfå™§8‰²½có{£ª=ø‡MVnƲ£ä!¦(­‡Ó∥½)ì°Î*˜Íŭ㸤¬Î‡3t]˜D×îÀ×]s «#»-@OÓŠ¶Wˆˆ b…¥gÄ 4¡#ä¸ 3D?dsÕJÝii»ô"B™/ØT²4mÌRc Â6¨xš ÷´^v™4¡î¾Lï$zÝiK 7ÊB,EÀ?|ؘFg‹ÔŸÂŸ'Ýø ÊÞÊ£¥ =p t¼ÑU'ÕÅ Åz×ãÓnl c½\±)„«å^?éÆÇSLþÁj³få’²Úî9'ž©mÖË+’!s51"q?ëB\/ˆsfKnP‡Ä"YŽ×YFDùS=óÍe¢Ê‚–вVî ª|ª^6…‚Yß5&ÆB©–yõœ›Å4šûò†Œ¡nºß¨m’è•@‘µZP Â‹ˆPXÇ>é²J¡UJJâ±:½Yµáwìù­Ýd憸š“+þ9USCªÇÒšQ­5·­ÖÀ /‡N®DßüÕº¬Ä„4ÙQŽ‹w‰°Š\Å·6ªÔÝt?P¸‰E&²byHñÙ´Q þ\1É*çpìj‚ê#Ò]™Ue2zøš†qÚ«š€]V¦ö%&ùM§Þ"Ó²r¡n]Xˆ®LÈr/ b˜ë#ôïÁaõ%aøíúcª)-øé&;u)Ù@ßñ× ²‰À'_;š†Ëâ”ýéZArùWìV¬ïtÂA©•usg„’ò› K\WôKt½Àg¥Ih*Ø2P Óp”"½iÙ‰+«¥—Zƒ“K›‘JƒÉWH"ÿ«‹éœ/P¹2ßú~<ïê§êÿ±å¨e¾ñ™MýèHºÌ&9€aBÀD%'´¡öo-Ísº½óÃÏõÔ œÏUÉA»v9ž×pëš ­Ê™¶´Xï¶Ÿ-ÈÅÇ•¸øŒ¹ëZnaóAu:þò>™‰»€QÿÅIÄ Yç¶í”^tã§)š"ê7Ùóî¹pê궈ß@»¥xCâäz?3½ç¬ “qF‘~@ÝáÊ ½]2(}%½áŦ q†î ÷G›@u„]•%»A½Ô»l^ªósÆÁ ùå%(-¬.Ü׉ê<‡!XcÁlèCMh¦ ¹5ë&.6Çr„³$w'кQJBVÂÙ_ ±pßI'åÑ8Å@Dæ¤`B™KdûX­’h ²0)"knJÃq't„Nsó¨ãr>€Ó4ßeý¹×&ídÝ©WF†Ì%1°qƒžÁΓª—`¾¸Ð•“qq±kVÇE¬Ñ´ètTaš6ñnÛÒmšR4 9Lù"¶q–.vÎ"E ð^tÍÓW‰…df5„D”¬TyL~À¬«rZ¿^U Êj}ä^@ý8t«(ßVÍÛ©Iï>–¶œ¢Ó³œCN•–›è  jÍ(ç™{·ÕJä)9px5a¦a:e—ûvh=äH?Ú7N<Û¡9O9T¥̋Ùç–r$ìXØEg“`s¿6³{µsAž$*Ú«äÁnS­ |ȸÆ$`n'½Nf—fñÀpiT7ñ‚ýO½|)Øp(‰Hì?b‹æs ºÏ&Y©µ:K¥¬€æä Sv“âFã ü™Nò6g"Ø×·«ŽJ ‚º k5!Qh!­Õ7 3¥¿Pâ,,F–-tzfJA)q¯ ^'³ÿµ,p >Ü_Ÿž÷éË'o_œœW©7Œ§L˜ȉJºÄ‡‘Ö²pZUd¼öħ…Ž8„Þ‚ÉÈE|®±¹ÖTÓ8":bñç©——Çqb¬Y[LÃ2‘aÛ¼­Ãõ½¦ ‹Û—rj—²2ôGûNÕNds(V‰çv¤'ˆÿ³˜`ȹÔ©åJý±>ä † Œšù1IâË' ª1žg*DEkÀ˜â(×4é’X°º¬ù‹ ²T¹ðRr¼MAV¶28vÉ©ZÎ3ë<º@rÅ&GÙ1Sˆk‡V7>Hr@8£X®¦¶·Úžnâþ¥t1Xrš`H¶æ…Lƒ*ÃL#GG ú‚„gK_/à¶"=ï¨X±²r”Y_(‚Ø‹@8Í"rÔ]®˜ƒœÉ®¡åúªuäN!ßd5у„UTóН9zIèË`%ÒŪ¯jy­‹õHö€¶>~òTñËg–Sù'ùlÆ[Œ*i u±Jºl"¾ÕKíñG@©7t)&ní^÷ó°õ޹μ[Ž\#Åë‡ ˜›[ñ\2 ð¼JÐD pÛRC²VV!Ëo¤€ÉrÓ±iô( HÁ;5K"=ˆµ¨†ÐÖí‚9q,àÙÌ¿ki1e|"¢!š7§¾ëJ.(j'®rôêÖÑy‰¦Ú̿߿ùæõÉ7èiE<ãøôìéÉ«ó×ÙyüÝË×ÿKNôqL%<§¢ÎŒ~ç %Fˆ²D0aRJ!Í”¤'9z’qÞæ¸ àðóBHÜ¡ èy>%ÓeŽe+¹º‚µ) ãŒâA0K ªwŠÐ¨gÊ)/\6‹\3™ƒ YÓŒz»…5„ÐÜvŸ*¢(Wá%¥èzÂ'4}ÔÉnúâSF&Ö®9$®¼À¸úžÉúš´¢Ó.ÄÜS:˜ ·³>.Eè6bõC)6ʦ|íñó×n1ø×%°i•hùîïtfðBCÈ (ž\BÎ"õ—Ì ÔŠžg©U˼07öÇ4HG´ÉÇ^?Úª–•*Fm[è Šn«Î ¢Pí[Ô pTP:KÎ(ƒwî9ò8ÌhýÐJoÔN´ Œ=;X܃n|þúøìÍs$ "uj ÉÂÃ/³Ð&Úû‡ m¬»U¨©Ê¶«ºjkülžÔ4^#³ƒ Û(`ê.l(æ(È…«Ñ3í”$ˆ¢í©¡|yƒyhûV½°¦q‡«§®KHƱڔß?ûc¢X‡Îå‰bRö¥EsÏžh2OÖ±yi&ãò´­Ã|!þÏ þÑ© Ö¾rEr5hŽÿ±ÚUˆãºÈ‰=r‰9ÙDxteO½TOö©¬Aj˜èo1{¡FЮoÄE¤"ÉfŠJ:Ë`èaÊŠU~ÖWƒDCƒÑdwÛ*à;Ö®Pu·ºÇú;„Íè€å¹5¯hó ŠÅñâô 9yýâôLS?++þ€”  ˆREñÍXéŒÓ'ä7¡Àb:‹õ)àæZ–é‘äŽlæ„u ãDq…l1®’+öŠæY êШ™œ0ž`T ÜÔ÷YÞt™K¥\øfl²O«êRUÄŒLØž„€wälæïÄ—RS8Ð!Å02²¼®AÏ£Ä3gÊæþ2 P­éÐöÅß‚Á¡¿z©Œ»¹4—mýpë8Ž]üŽv‰8Q“ ‰Aå²iÀ Éu³×‹§XyÏ…‘|¡öϼÈ)Ù?õÀ7[[éÞ.°š¥°öÊk8-IÑš{ev•‰10\bTu O…ü Ð$ÍÀfï̇‹rñ gç­”¿pôm›P2Y²/Ù5m—}HËÎמn ìÖúý€“s>B<ȆëTAê°'OÛOpjäê w>”bGäMÛ n¹ïª¥-§þ¸°At“ØQȬMpד¶^ §-VÝe¬ý`b¥8åìÌÑÌŒœØìÈ"¬$W¯?{{þöõIüúäO§oÄtqþí雸ùé““³7¢° sÑ%~>OXÊÔ+¬ì–5Î$Ë^pjA&2ÿŠØÆíØVü\àâÁ®|›-2—rË)*ï%2îbYj ¬‹ˆ´…q×2BÐUèG…r7³” )Œ€;Isò’óº ¾äÝÝ]÷j¾DŒIAÈ{ô•Å&ƒEPzOAÑë?a¯âÕÒ¬!«ì®2Œ5†à.®‚ y04=¢—D]i³¶øvC¦¯-·¥“3rçŠßϯðŽp6yØÊèì5–xjNÈp‡ )U…;´…x/¼ÁÐãâpäkcY¶Q£ïÕta(ÉŽxœšÎª+Â鉷îÖH¹Å$ï¯p]O›™\çyAÖIyS 7)µ±j¸«ö|‘¸wˆuPeʺ{|¹,ûb³Ú~…7ØV&!l²UHD•õãafdb1¨eºŠ”1a'¿ïOÌÊ@¸¢EÂqËkâiô¬ý~×P$¢@. wëER Õa`küsü’‹œòâ7Xu ãpëÅ‹'ôëŽKä§v¾¾ø;X¥ïÒ‹e^öÊv޳!{e|aTšD­a1³P‰l—F Q 4³MÄ€\•)Úˆ`úØ–Ã"â5¾Ë~ÌxGù-Ø| ¬"sñÕ{Iì0p©n´Áò¸•1‹Â¾¡ ò¬€2Ÿø€‹Ô-¦¸ãÍ!̦m×À­'O:_ÿ¹óæXÃ<<èFîL-âãÒî:o®á#¸÷°ÛóåZש¹B•fžä‹[žo›t3uè˜M²™m÷ˆØ¶]È8™Íͤ/ É x€–™ x°€¢Ãÿˆ›Éó,ÁˆkL›8qºr‚»çyCJvÁ¨ÈÍu…]ÅÓ¹ Üáeä:‘n‘Ê/‰Rܳ9›uÄÅʰv8j‰Ùp‡Ðxw<‡-…#¸•β«ÌaEÙŒ“-W𖧦5/ÏÉ‘—’ú#1L© yÕ-HC(Q-d2ë2Ý›‘2¦ŽE8b”¹µ›ê±ÖúŽl}÷:Áw´—1ã 2—dC¬É vh.x9¼>Qøåfr‡~MØÖÚ™Kuƒ…ÆBÇ$êAv˜¾Yq‹iýäêÉ%4`,æ[2<ËM*±ŸÇË+0öù„›‘z¦TCÓY0ó8~úôäìéÛG ËºØ†ÀµCå­ÿæñþDÑyMã‘f}:¶ú!Øj«¬P«#O ›{Ž%Žóà´Y+è8­‡âè>‹% «8ÒÁ߸œ'è<þóÉñkó÷Ë·¯ã³ã'¶äì+g‘IÌnéÔY)¼„CŒ)Õ•3|·¸>_a4ÞÖ°íÒRȲf Ì–A£:£u0†mø¸’+ßfÕIÅIISø½Ãã©Íœ”z(EMLŪöŸÿiBšk^VË¥·G«nüÕD»8ÏH{i·`AºÝ.Mf+¦j/‘îôÄ.f¢ÆªL8™ÏOßœ=îäôu|~zþüäM;(çD[ŽÒ½ÜŽm\x4„"p ¹W6Y‹®æm,$W£r‹¾AÎ#ð× À¾I˜…R$T·™a)*ò.B)’%{â [*æ)z¹½× Eb¶ßƒâœ*¨4ÁŸäqt—F›<ï¬ï©{8 ¸g|Ù¨ºÅuÎFL­¶°ßÖÆHö66á°S½#ÄgbIô*\_YâÔŒëCM½ïÀ”h8….OD\Èáÿú·ì‡ÿëüG´¿HçKs wcgFê}×ÿ ëòÇÛx®÷vLC_C±ù¦×ÝŸS°‹`lW¬zbN[Ò<ù#îú놸º ~"u=° ó´@·Ûè}ŽE`åãîæ I• ![¤ÚÐ-nè¯^#vþ?±Šym›üX°Dº¡§Yr5Ï €16Z-/ÀN¥±õkä7D Pmgƒ5zöôùúS¯áuºÒûÃþèa ¡µƒ¢Ç*Ë]iH€WÉ{¬[Ûáuæ/ å5'à%uD~µ á*®_ðàb¯îÊô<¢z:î-Ûú»öÍ«Nöú†”0îS ÿÏKÕ!î¿™B2¡ùõôè ¼¦T.bEk›Œ( 4õ­­§G!¡iÕzzT·×5Öïš 5ÞÎÔj‘Y‰ˆø3ªkè,/ÓµìqùòV0Ž4ƒ«°õ‹ÝÔP@àÖ/¶G±š)äzÂ&' Ô(®×Yw ¼Çj2Ò•„ºiY"FMsë§öŠqd×lÜú+ò:¹B Pߢ{¬éҾɦiçâ¾Ñ>ÌDê–|ý½¹Ÿç·E¶R‚ˆ79Gª¡F b£Å>¿Næ?®¿#ë¥Ús"^×Ö_Ú·’¸´š­ß~¹Ökµîöƒrqž\Åç`>ŠH¥0ZÃ/ýÞhÈ¿2Mûe°×ßã‚ûe8ø+ú/£þh/zš)29ø¥?Þõå1}tMÓ£Á^Ð4hytÈßxÑ/£AïP:u§ü—ÑððP^pë—Ѹ¿7´ûç—qox¸Oc}ʼϸX'ÉX¿Œ{‡<›c§¡âð—³ÄÕV¥Ò\6£‡%õa’þr`–‚›{‚Éǃ”¡â™YAlA9©*ì/ýþ¸У×ß §uàu¾‡}z œlçYž—sÃ;:ý_úƒ~ooÄ«"‡> û•µr_ïÚm´Òî/ýa¿¿7nÔ¥ÙýÑ /[ çÎÄ`ÌsAÓ—.ÏÀr鮿‰ƒñ¡ rµÀ÷Ko´¿ï†nôÜ_ú‡#sÌO C²G=úÿÙU+ýõnumdiff-5.9.0/docs/numdiff.txi0000644000175000017500000051735313054341114015621 0ustar paologpaolog\input texinfo @c -*-texinfo-*- @c %**start of header @setfilename numdiff.info @settitle Numdiff Manual 5.9 @afourpaper @c %**end of header @dircategory Text creation and manipulation @direntry * Numdiff: (numdiff). Comparing files containing numeric fields (and not only) @end direntry @copying @emph{``...und der eignen Kraft vertrauend steigt ein frei Geschlecht empor!''} @sp 2 @noindent This manual describes how to install and use Numdiff, a program which compares putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. Copyright @copyright{} 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi @email{ivprimi(at)libero(dot)it} @quotation Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in @ref{GNU Free Documentation License}. @end quotation @end copying @titlepage @title Numdiff User Manual, version 5.9 @page @vskip 0pt plus 1filll @insertcopying @end titlepage @c Output the table of the contents at the beginning. @contents @ifnottex @node Top, Copying, (dir), (dir) @top Numdiff User Manual @insertcopying @end ifnottex @menu * Copying:: Numdiff Copying Conditions (GPL) * Acknowledgments:: Acknowledgments * Overview:: Introduction to numdiff * Installing:: How to install numdiff * Invoking numdiff:: How to use numdiff * ndselect:: (numdiff) ndselect. Selecting lines and fields * Invoking ndselect:: How to use ndselect * Filtering:: How to use the filter of numdiff * Warnings:: Various recommendations * GNU Free Documentation License:: The license covering this document * Index:: Complete index @end menu @node Copying, Acknowledgments, Top, Top @chapter Copying @cindex Copying Conditions @cindex License @cindex GNU General Public License @cindex GPL Numdiff (also written numdiff) is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Numdiff 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 @uref{http://www.gnu.org/licenses/}. @node Acknowledgments, Overview, Copying, Top @chapter Acknowledgments @cindex Acknowledgments @cindex Thanks I want to thank Mr. Norman Clerman @email{norm(dot)opcon(at)fuse(dot)net} for several suggestions he gave me to improve the readability and the effectiveness of the output produced by Numdiff. He also pointed out the need to implement a filter to resynchronize the lines between two files in case of addition or deletion of one or more lines. I have to give him credit for the urge to prepare the versions 4.x and 5.x of Numdiff. Moreover, I want to thank my friends Mariapia Palombaro, since she removed some errors while reviewing the first version of this document, and Paolo Caramanica, who suggested me to add more information to the output of the option @option{-S}. @node Overview, Installing, Acknowledgments, Top @chapter Overview @cindex Introduction @cindex Usage of numdiff @cindex Purposes @cindex How to use numdiff Computer users often find occasion to ask how two files differ. Perhaps one file is a newer version of the other file. Or maybe the two files started out as identical copies but were changed by different people. There are several ways to look at the differences between two files. One way consists in looking at the series of lines that were deleted from, inserted in, or changed in one file to produce the other file. The well-known @command{diff} program compares two files line by line, finds groups of lines that differ, and reports each group of differing lines. Without particular options, when comparing lines the @command{diff} program considers any change in the amount or in the type of the characters as a difference. However, trough some command line options the user can suppress the output of certain kinds of differences that are not important to him. For instance, @command{diff} provides options to ignore differences in the amount of white space between words or lines, or differences in alphabetic case. Another way to look at the differences between two files consists in considering the words that were deleted from, inserted in, or changed in one file to produce the other file. Here ``word'' refers to a sequence of non white-space characters delimited by a couple of white-spaces, one before and the other one after the word. The @command{wdiff} program by Fran@,{c}ois Pinard @email{pinard(at)iro(dot)umontreal(dot)ca} compares words in two files and reports the differences. Finally, one can regard the differences between two files as a sequence of pairs of differing bytes. The @command{cmp} program reports the differences between two files byte by byte, instead of line by line or word by word. As a result, it is often more useful than @command{diff} or @command{wdiff} for comparing binary files. However, none of these approaches turns out to be good when you want to compare a couple of text files composed partially or entirely by numerical fields. In such a case what you want to obtain usually is a list of the numerical fields in the second file which @strong{numerically} differ from the corresponding fields in the first file. But, while a number can be written using different notations, programs like @command{diff} or @command{wdiff} can not recognize whether a difference between two numeric fields is only due to the notation or is actually a difference of numerical values. For instance, 11.23 and 11.2300000 are the same number but represented in different ways. If you are interested in the numerical values, the difference in the representation is not meaningful and then should be ignored. However, @command{diff} and @command{wdiff} always consider the previous one as an actual difference: there is no way for you to tell these programs to ignore it. Another example of this type is given by 98765.4321 and 9.87654321E04. Here the difference is only due to the use of the scientific notation in place of the ordinary decimal notation. In addition, depending on your country you could stick to different conventions in writing numbers. For example, the amount ``three hundred millions and fifty-two thousands of dollars and forty-six cents'' is usually written by an Italian accountant as 300.052.000,46$ while an American accountant would write 300,052,000.46$. Of course, 300.052.000,46$ and 300,052,000.46$ represent the same amount of money but @command{diff} and @command{wdiff} would report a difference, which probably is not what you want in such a case. Lastly, sometimes you could wish to ignore even differences in numerical values as long as they do not exceed a certain threshold. In other words, you could desire to suppress the report of all ``small'' numerical differences. For example, it could happen that you want to ignore all numerical differences whose absolute value is not greater than 0.0001. If this is the case, then the numerical fields 33 and 33.00009 should be considered equal, while 33 and 33.00011 should be reported as different. However, @command{diff} and @command{wdiff} can not be used to ignore small numerical differences, since they do not even know what a numerical difference is. These are the reasons why I decided to implement a new program with the capability to appropriately compare files containing numerical fields. In writing this program I was inspired by @command{ndiff}, a GPL'ed software by Nelson H. Baabe of the Salt Lake City University. @command{ndiff} is actually a good tool, and I used it for a while. But I did not completely like the way it works, and so @command{numdiff} was conceived. Although @command{ndiff} inspired @command{numdiff}, they are completely different from the viewpoint of the source code: @command{numdiff} has been entirely written from scratch with the addition of code coming from GNU bc, GNU diff and GNUlib. In addition, the last versions of Numdiff offer much more features than @command{ndiff} does. @command{numdiff} can be used to compare putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. @command{numdiff} takes two mandatory arguments, the paths of the two files to compare, and, after splitting them into lines and the lines into fields according to a given list of field delimiters, it compares every field of every line of the first file with the corresponding field of the second file. What @emph{corresponding} here exactly means depends on the options passed to the program on the command line. With no options, corresponding means the field of the second file at the same position, where position refers both to the line number and to the location within the line. If the compared fields are both legal numerical values, then @command{numdiff} performs a numerical comparison between them, otherwise it performs a literal comparison, i.e. the usual byte-by-byte comparison. In case of literal comparison, two fields are regarded as equal if they are formed by the same sequence of characters. In case of numerical comparison and without specific command line options, two fields are regarded as equal if their numerical difference is zero. Mind that, if you do not explicitly specify a list of field delimiters by means of the option @option{-s} or @option{-D}, @command{numdiff} takes as field delimiters the characters newline (@samp{\n}, ASCII code 0x0A), horizontal tabulation (@samp{\t}, ASCII code 0x09), and blank (@samp{ }, ASCII code 0x20). For example, if the file @file{list1} contains the data @verbatim accident 123 23Joshua 34.55 +3+4i water dog -3455.321 cat 2.345678e-9 .0005-6.23e2i @end verbatim @noindent and file @file{list2} contains the data @verbatim Accident 123 23456 34.5500 +3.0001+4i dog -3455.320098 Cat +2.345678e-9 -6.23e2i $$$ A new line @end verbatim @noindent then the output of the command @samp{numdiff list1 list2} will be: @example ---------------- ##1 #:1 <== accident ##1 #:1 ==> Accident @@ @@@@ ##1 #:3 <== 23Joshua ##1 #:3 ==> 23456 @@ @@@@ ##1 #:5 <== +3+4i ##1 #:5 ==> +3.0001+4i @@ Absolute error = 1.0000000000e-4, Relative error = 2.0000000000e-5 ##1 #>6 <== water ##1 ==> @@ Line 1 in file "list2" is shorter than expected! ---------------- ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @@ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 ##2 #:3 <== cat ##2 #:3 ==> Cat @@ @@@@ ##2 #:5 <== .0005-6.23e2i ##2 #:5 ==> -6.23e2i @@ Absolute error = 5.0000000000e-4, Relative error = 8.0256821830e-7 ##2 <== ##2 #>6 ==> $$$ @@ Line 2 in file "list1" is shorter than expected! ---------------- ##3 <== ##3 #>1 ==> A new line @@ Line 3 in file "list1" is shorter than expected! ---------------- <== ##4 ==> +++ File "list1" differs from file "list2" @end example At the same time @command{numdiff} will print the following error message on stderr: @example *** End of file "list1" reached while trying to read line 4. File "list2" has more lines than file "list1", line 4 is the last one read from file "list2" @end example It is worth remarking that @command{numdiff} can recognize complex numbers, provided that they are written in the form @math{a+bi} or @math{a-bi} with no extra characters between the values @math{a}, @math{b} and the sign @math{+} or @math{-} (the symbol @math{i}, used to represent the imaginary unit, can be changed by a suitable command line option, @pxref{Invoking numdiff}). Do not worry if you do not know what complex numbers are: probably you will never manage files containing complex numbers, thus you can live happily without them. :) We consider now an example which shows how Numdiff can resynchronize the lines between two files in case of addition or deletion of one or more lines. The versions of Numdiff prior to 5 did not work well if one of the two files to compare contains in the middle some lines more or less than the other one. For instance, if you have one file that is 1000 lines long that you are comparing to a second file 1001 lines long, and except for that one extra line, located, let us say, at line 500, the files are identical, then @command{numdiff} version 4.x does @strong{not} show only the one line difference: once the files are out of synchronization @command{numdiff} 4.x reports every line as different. Since version 5 it is possible in such cases to activate a filter which handles additions and deletions of lines. There are several options ruling how the filter actually works, and I will give later a detailed explanation on how to use them to obtain each time the wished result. The simplest way to activate the filter consists in using the option @option{-z @@}. If @file{bill1} and @file{bill2} are given by @verbatim Month Expenses ------------------------- Jan09 $ 233.56 Feb09 $ 850.77 Mar09 $ 12.55 Apr09 $ 524.00 May09 $ 78.25 Jun09 $ 230.00 Jul09 $ 443.10 Aug09 $ 67.65 Sep09 $ 10.00 Oct09 $ 201.45 Nov09 $ 110.00 Dec09 $ 200.27 ------------------------- Total $ 2961.60 @end verbatim @noindent and @verbatim Month Expenses Jan09 $ 234.00 Mar09 $ 13.00 May09 $ 78.25 Jul09 $ 443.10 Sep09 $ 10.00 Nov09 $ 110.00 Jan10 $ 200.00 ------------------------- Total $ 1088.35 @end verbatim @noindent respectively, then the differences between the two files are: @itemize @item the insertion of the separator @verb{|-------------------------|} in @file{bill1} before the list of the months, @item the deletion in @file{bill2} of the lines related to the expenses for the months February, April, June, August, October, December, @item small changes in @file{bill2} to the expenses of the months January 2009 and March, @item the presence in @file{bill2} of an entry for January 2010 just before the separator @verb{|-------------------------|}, @item the addition of an empty line to @file{bill2} after the separator @verb{|-------------------------|}, @item and the different values for the total sum of the expenses. @end itemize The output of the command @samp{numdiff -z @@ -V bill1 bill2} (I have added here the option @option{-V} to let Numdiff show which couples of lines it is comparing each time) shows exactly the expected differences: @anchor{command} @example ---------------- ##2 <== ------------------------- ==> ---------------- ##3 <== Jan09 $ 233.56 ##2 ==> Jan09 $ 234.00 ##3 #:3 <== 233.56 ##2 #:3 ==> 234.00 @@ Absolute error = 4.4000000000e-1, Relative error = 1.8838842268e-3 ---------------- ##4 <== Feb09 $ 850.77 ==> ---------------- ##5 <== Mar09 $ 12.55 ##3 ==> Mar09 $ 13.00 ##5 #:3 <== 12.55 ##3 #:3 ==> 13.00 @@ Absolute error = 4.5000000000e-1, Relative error = 3.5856573705e-2 ---------------- ##6 <== Apr09 $ 524.00 ==> ---------------- ##8 <== Jun09 $ 230.00 ==> ---------------- ##10 <== Aug09 $ 67.65 ==> ---------------- ##12 <== Oct09 $ 201.45 ==> ---------------- ##14 <== Dec09 $ 200.27 ##8 ==> Jan10 $ 200.00 ##14 #:1 <== Dec09 ##8 #:1 ==> Jan10 @@ @@@@ ##14 #:3 <== 200.27 ##8 #:3 ==> 200.00 @@ Absolute error = 2.7000000000e-1, Relative error = 1.3500000000e-3 ---------------- <== ##10 ==> ---------------- ##16 <== Total $ 2961.60 ##11 ==> Total $ 1088.35 ##16 #:3 <== 2961.60 ##11 #:3 ==> 1088.35 @@ Absolute error = 1.8732500000e+3, Relative error = 1.7211834428e+0 +++ File "bill1" differs from file "bill2" @end example Looking at the displayed report we see that: @itemize @item the second line of file @file{bill1}, i.e. the one containing the separator, has no correspondance, or, if you prefer, has been deleted from file @file{bill2}. @item The lines related to the months January and March 2009 have been slightly modified in @file{bill2}, namely the values of the expenses are slightly different. Notice that the line with the expenses for January 2009 is the third one in file @file{bill1} and the second one in file @file{bill2}. This information is printed by Numdiff in the form @example ##3 <== Jan09 $ 233.56 ##2 ==> Jan09 $ 234.00 @end example Analogously, @example ##5 <== Mar09 $ 12.55 ##3 ==> Mar09 $ 13.00 @end example says that the line for March is the fifth one in @file{bill1} and the third one in @file{bill2}. @item The line related to the total amount of the expenses appears also differently in the two files, since the amount of the expenses is different. Notice that this line is the 16th one in file @file{bill1} and the 11th one in file @file{bill2}. @item The lines related to the months February, April, June, August and October, i.e. the lines no. 4, 6, 8, 10, and 12 of @file{bill1}, are not present in @file{bill2}. @item The line of @file{bill1} with the expenses for December 2009 is replaced in @file{bill2} by the line containing the value of the expenses for January 2010. @item The tenth line of @file{bill2}, i.e. the empty line after the separator, is not present in @file{bill1}. With respect to @file{bill1} this line represents then an addition. @end itemize If you compare @file{bill1} and @file{bill2} without using the option @option{-z @@}, the result is completely misleading. This is the output of @samp{numdiff -V bill1 bill2}: @example ---------------- ##2 <== ------------------------- ##2 ==> Jan09 $ 234.00 ##2 #:1 <== ------------------------- ##2 #:1 ==> Jan09 @@ @@@@ ##2 <== ##2 #>2 ==> $ 234.00 @@ Line 2 in file "bill1" is shorter than expected! ---------------- ##3 <== Jan09 $ 233.56 ##3 ==> Mar09 $ 13.00 ##3 #:1 <== Jan09 ##3 #:1 ==> Mar09 @@ @@@@ ##3 #:3 <== 233.56 ##3 #:3 ==> 13.00 @@ Absolute error = 2.2056000000e+2, Relative error = 1.6966153846e+1 ---------------- ##4 <== Feb09 $ 850.77 ##4 ==> May09 $ 78.25 ##4 #:1 <== Feb09 ##4 #:1 ==> May09 @@ @@@@ ##4 #:3 <== 850.77 ##4 #:3 ==> 78.25 @@ Absolute error = 7.7252000000e+2, Relative error = 9.8724600639e+0 ---------------- ##5 <== Mar09 $ 12.55 ##5 ==> Jul09 $ 443.10 ##5 #:1 <== Mar09 ##5 #:1 ==> Jul09 @@ @@@@ ##5 #:3 <== 12.55 ##5 #:3 ==> 443.10 @@ Absolute error = 4.3055000000e+2, Relative error = 3.4306772908e+1 ---------------- ##6 <== Apr09 $ 524.00 ##6 ==> Sep09 $ 10.00 ##6 #:1 <== Apr09 ##6 #:1 ==> Sep09 @@ @@@@ ##6 #:3 <== 524.00 ##6 #:3 ==> 10.00 @@ Absolute error = 5.1400000000e+2, Relative error = 5.1400000000e+1 ---------------- ##7 <== May09 $ 78.25 ##7 ==> Nov09 $ 110.00 ##7 #:1 <== May09 ##7 #:1 ==> Nov09 @@ @@@@ ##7 #:3 <== 78.25 ##7 #:3 ==> 110.00 @@ Absolute error = 3.1750000000e+1, Relative error = 4.0575079872e-1 ---------------- ##8 <== Jun09 $ 230.00 ##8 ==> Jan10 $ 200.00 ##8 #:1 <== Jun09 ##8 #:1 ==> Jan10 @@ @@@@ ##8 #:3 <== 230.00 ##8 #:3 ==> 200.00 @@ Absolute error = 3.0000000000e+1, Relative error = 1.5000000000e-1 ---------------- ##9 <== Jul09 $ 443.10 ##9 ==> ------------------------- ##9 #:1 <== Jul09 ##9 #:1 ==> ------------------------- @@ @@@@ ##9 #>2 <== $ 443.10 ##9 ==> @@ Line 9 in file "bill2" is shorter than expected! ---------------- ##10 <== Aug09 $ 67.65 ##10 ==> ##10 #>1 <== Aug09 $ 67.65 ##10 ==> @@ Line 10 in file "bill2" is shorter than expected! ---------------- ##11 <== Sep09 $ 10.00 ##11 ==> Total $ 1088.35 ##11 #:1 <== Sep09 ##11 #:1 ==> Total @@ @@@@ ##11 #:3 <== 10.00 ##11 #:3 ==> 1088.35 @@ Absolute error = 1.0783500000e+3, Relative error = 1.0783500000e+2 ---------------- ##12 <== Oct09 $ 201.45 ==> *** End of file "bill2" reached while trying to read line 12. File "bill1" has more lines than file "bill2", line 12 is the last one read from file "bill1" +++ File "bill1" differs from file "bill2" @end example Numdiff compares now the first, second, third line of @file{bill1} with the first, second, third line of @file{bill2}, and so on. But probably this is not what you want in such a case: what is reasonable here is to compare entries related to the same month and not lines having the same location, i.e. the same line number. Numdiff offers also an option to run just the filter and see how it resynchronizes the two given files without performing any comparison of corresponding lines. The output of @samp{numdiff -z @@ -f bill1 bill2} is @example Month Expenses Month Expenses ------------------------- < Jan09 $ 233.56 Jan09 $ 234.00 Feb09 $ 850.77 < Mar09 $ 12.55 Mar09 $ 13.00 Apr09 $ 524.00 < May09 $ 78.25 May09 $ 78.25 Jun09 $ 230.00 < Jul09 $ 443.10 Jul09 $ 443.10 Aug09 $ 67.65 < Sep09 $ 10.00 Sep09 $ 10.00 Oct09 $ 201.45 < Nov09 $ 110.00 Nov09 $ 110.00 Dec09 $ 200.27 | Jan10 $ 200.00 ------------------------- ------------------------- > Total $ 2961.60 Total $ 1088.35 +++ File "bill1" differs from file "bill2" @end example @noindent and shows that the filter is doing its job in the right way, associating the lines according to the month and not to the line number. Running just the filter is extremely useful in all situations when you are not sure if the filter is working as you wish. You have indeed to instruct the filter in the right way to let it work correctly, and this requires the use of different options depending on the structure of the files to compare. Since guessing the right options can be sometimes tricky, running just the filter and see the result is the best way to be certain that you are setting up everything correctly. Later, @pxref{Filtering}, I will explain in detail @itemize @item what the filter does behind the scenes to understand if and how it has to resynchronize the files to compare, @item and how the related options affect the action of the filter. @end itemize By the way, it is even possible to use @option{-f} without any other additional option for the filter, like in @samp{numdiff -f bill1 bill2}, but the result is more or less the same you would obtain by performing a byte-by-byte comparison with removal of the field delimiters. The option @option{-f} can be followed by an argument in the form of an integer number whose meaning will be explained later, @pxref{Use of the option -f}. Even if the output of @command{numdiff} is supposed to be self-explanatory, in the next section I will explain in details all you should know about it. @menu * Output format:: How numdiff prints its reports on stdout * Overview mode:: An alternative way to print listings of differences * Filter output:: How the built-in filter prints its report * Raw output:: A compact output format suitable for automated parsing @end menu @node Output format, Overview mode, , Overview @section Output format @cindex Output format (numdiff) @cindex Format of the reports Let us go back to our first example. If the files @file{list1} and @file{list2} contain the data @verbatim accident 123 23Joshua 34.55 +3+4i water dog -3455.321 cat 2.345678e-9 .0005-6.23e2i @end verbatim @noindent and @verbatim Accident 123 23456 34.5500 +3.0001+4i dog -3455.320098 Cat +2.345678e-9 -6.23e2i $$$ A new line @end verbatim @noindent respectively, then the output of the command @samp{numdiff list1 list2} will be: @example ---------------- ##1 #:1 <== accident ##1 #:1 ==> Accident @@ @@@@ ##1 #:3 <== 23Joshua ##1 #:3 ==> 23456 @@ @@@@ ##1 #:5 <== +3+4i ##1 #:5 ==> +3.0001+4i @@ Absolute error = 1.0000000000e-4, Relative error = 2.0000000000e-5 ##1 #>6 <== water ##1 ==> @@ Line 1 in file "list2" is shorter than expected! ---------------- ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @@ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 ##2 #:3 <== cat ##2 #:3 ==> Cat @@ @@@@ ##2 #:5 <== .0005-6.23e2i ##2 #:5 ==> -6.23e2i @@ Absolute error = 5.0000000000e-4, Relative error = 8.0256821830e-7 ##2 <== ##2 #>6 ==> $$$ @@ Line 2 in file "list1" is shorter than expected! ---------------- ##3 <== ##3 #>1 ==> A new line @@ Line 3 in file "list1" is shorter than expected! ---------------- <== ##4 ==> +++ File "list1" differs from file "list2" @end example @command{numdiff} prints a report on the standard output for every field of the first file which differs from the corresponding field of the second file. This report indicates first the locations of the fields, namely the numbers of the lines where the fields appear and their positions within the line. The position in the line is ``1'' for the first field of a line, ``2'' for the second field, ``3'' for the third one, and so on: fields are numerated starting from the left hand of the line and proceeding towards the right hand. For each report the line number is introduced by the symbol ``##'', while the field number by ``#:''. Then @command{numdiff} shows in what the difference consists. For example, @example ##1 #:1 <== accident ##1 #:1 ==> Accident @@ @@@@ @end example @noindent means that the first field of the first line is ``accident'' in the first file, while in the second file it appears as ``Accident''. This difference could be then canceled by removing ``accident'' from the first file and inserting ``Accident'' in place of it. The arrows ``<=='' and ``==>'' try to visualize this idea. Analogously, @example ##2 #:2 <== -3455.321 ##2 #:2 ==> -3455.320098 @@ Absolute error = 9.0200000000e-4, Relative error = 2.6104672633e-7 @end example @noindent means that the second field of the second line is ``-3455.321'' in the first file and ``-3455.320098'' in the second one. Since the contents of the field are numerical in both files, @command{numdiff} also prints the absolute and relative errors. The absolute error (or absolute difference) is given by the absolute value of the difference between the values appearing in the two files. The relative error (or relative difference) is actually defined in a more complicated way. If @emph{n1} is the value appearing in the first file and @emph{n2} is the value in the second file, then the absolute error is given by the formula @emph{A=|n1-n2|}, while the relative error @emph{R} is given by: @itemize @item @emph{R = 0} if @emph{n1} and @emph{n2} are equal, @item @emph{Inf} (infinity) if @emph{n2} differs from @emph{n1} and at least one of them is zero, @item @emph{R = A/ min(|n1|, |n2|)} if @emph{n1} and @emph{n2} are both non zero and @emph{n2} differs from @emph{n1}. @emph{min(|n1|, |n2|)} denotes the minimum between the absolute value of @emph{n1} and the absolute value of @emph{n2}. @end itemize @noindent With these definitions of absolute and relative error it turns out that @emph{A(n2, n1) = A(n1, n2)} and @emph{R(n2, n1) = R(n1, n2)}. In other words, the absolute/relative error does not change if you only change the order of the compared values. Since version 5 it is actually possible to let Numdiff compute the relative error always with respect to the value from the first file or always with respect to the value from the second file, instead of using the preceding formula. This can be done through the option @option{-F}, @pxref{Alternative formulas for the computation of the relative difference}. If at least one of the compared fields is not numerical, then the output line reporting absolute and relative errors is replaced by the separator: @verbatim @ @@ @end verbatim It can happen that a line in one of the two files to compare contains more fields than the corresponding line of the other file. If this is the case, @command{numdiff} reports this difference by telling that a certain line (identified by its line number) appears to be shorter than expected, just as in @example ##1 #>6 <== water ##1 ==> @@ Line 1 in file "list2" is shorter than expected! @end example or in @example ##3 <== ##3 #>1 ==> A new line @@ Line 3 in file "list1" is shorter than expected! @end example In addition, @command{numdiff} shows the @i{tail} of the longer line, using the notation ``#>@math{n}'' to indicate the number @math{n} of the first field of the longer line for which there is no corresponding field in the shorter line. For example, @example ##1 #>6 <== water ##1 ==> @@ Line 1 in file "list2" is shorter than expected! @end example @noindent means that none of the fields of the first line starting from the sixth one has a corresponding field in the second file (@file{list2}). In this context, the symbol @verb{|<<*>>|} (if it appears) is used to denote the End-Of-File, i.e. a line or the tail of a line which is located at the end of the corresponding file and does not have a terminating @emph{newline} character. It can also happen that one of the two files to compare has less lines than the other one. In this case, if no special option is passed to the program, @command{numdiff} prints the number of the first line which appears in only one of the two files and a message on the standard error telling in which of the two files the end has been prematurely reached: @example *** End of file "list1" reached while trying to read line 4. File "list2" has more lines than file "list1", line 4 is the last one read from file "list2" @end example Unless the option @option{-q} is used (@pxref{Invoking numdiff}), @command{numdiff} prints to the standard output a message reporting the final status of the comparison. This message says either the two files are equal or they are different, just as in the example we are considering: @example +++ File "list1" differs from file "list2" @end example @node Overview mode, Filter output, Output format, Overview @section Overview mode @cindex Overview mode of numdiff @cindex Side-by-side report (numdiff) Since version 5.6 an alternative way to display the differences between two files is available, which can be activated through the option @option{-O}. If this option is present on the command line, @command{numdiff} prints a side-by-side report instead of the usual one. For example, if @file{sheet1} contains the text @verbatim A 1 1 B 2 4 C 3 9 D 4 16 E 5 25 F 6 36 G 7 49 H 8 64 I 9 81 J 10 100 @end verbatim @noindent and @file{sheet2} the following lines @verbatim A 1 1 B 2 4 C 3.3 9.03 D 4 16 E 5.5 25.05 F 6.6 36 G 7.7 49.49 H 8 64 I 9.9 81.09 @end verbatim @noindent then @samp{numdiff -O sheet1 sheet2} prints this report @example A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 :!:C 3.3 9.03 D 4 16 D 4 16 E 5 25 :!:E 5.5 25.05 F 6 36 :!:F 6.6 36 G 7 49 :!:G 7.7 49.49 H 8 64 H 8 64 I 9 81 :!:I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" @end example On the left side you can see the lines coming from the file specified as first on the command line, i.e. @file{sheet1}, on the right side the lines from the second file of the command line, in this case @file{sheet2}. In the middle there is a @i{gutter} which contains one of these markers: @table @samp @item white spaces The corresponding lines are in common. That is, either the lines are identical, or the difference is ignored because of one of the options @option{-s}, @option{-D}, @option{-I}, @option{-X}, @option{-a}, @option{-r}, @option{-P}, or @option{-N}. @item :!: The corresponding lines have at least one field which differs. @item :<: The files differ and only the first file contains the line. @item :>: The files differ and only the second file contains the line. @end table In the case of @file{sheet1} and @file{sheet2} a message is printed after the report saying that the end of the second file has been prematurely reached. The two files do not have indeed the same number of lines and the filter has not been activated. The option @option{-O} can take an optional argument, which allows to set the width of the output and eventually to suppress common lines, @pxref{Invoking numdiff}. The default value for the width of the side-by-side report is 130. No wonder then that the command @samp{numdiff -O40 sheet1 sheet2} displays a report with shorter lines: @example A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 :!: C 3.3 9.03 D 4 16 D 4 16 E 5 25 :!: E 5.5 25.05 F 6 36 :!: F 6.6 36 G 7 49 :!: G 7.7 49.49 H 8 64 H 8 64 I 9 81 :!: I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" @end example A negative argument makes that only the differences are listed in the side-by-side report, as shown by the output of the command @samp{numdiff -O40 sheet1 sheet2}: @example C 3 9 :!: C 3.3 9.03 E 5 25 :!: E 5.5 25.05 F 6 36 :!: F 6.6 36 G 7 49 :!: G 7.7 49.49 I 9 81 :!: I 9.9 81.09 J 10 100 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" @end example If you set the width of the report to a too small value, it can happen that some or even all lines from the compared files appear truncated as in the output of @samp{numdiff -O24 sheet1 sheet2}: @example A 1 A 1 B 2 B 2 C 3 :!: C 3.3 D 4 D 4 E 5 :!: E 5.5 F 6 :!: F 6.6 G 7 :!: G 7.7 H 8 H 8 I 9 :!: I 9.9 J 10 :<: *** End of file "sheet2" reached while trying to read line 10. File "sheet1" has more lines than file "sheet2", line 10 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet2" @end example If you set the width of the report to a very small value, Numdiff ignores it and uses the default value, i.e. 130. Notice that the numeric argument must immediately follow the option @option{-O}, intermediate spaces are not allowed. This is also the case for the optional argument of @option{-f}, while the options of Numdiff which require a mandatory argument permit the presence of intermediate spaces between them and the argument. The option @option{-O} can be used together with any other option of Numdiff except for @option{-f}, @option{-q}, @option{-U}, @option{-E}, @option{-V} and @option{-b}. When @option{-O} is in use, @option{-U}, @option{-E}, @option{-V} and @option{-b} are ignored. If @option{-q} is present on the command line together with @option{-O}, then @option{-O} is ignored. Finally, if both @option{-f} and @option{-O} are present, then the behavior depends on the order: the option which appears first on the command line is the one which matters. Therefore, the command @samp{numdiff -O40 -f sheet1 sheet2} displays the same report as @samp{numdiff -O40 sheet1 sheet2}, while the output of @samp{numdiff -f -O40 sheet1 sheet2} is given by @example A 1 1 A 1 1 B 2 4 B 2 4 C 3 9 | C 3.3 9.03 D 4 16 D 4 16 E 5 25 | E 5.5 25.05 F 6 36 | F 6.6 36 G 7 49 | G 7.7 49.49 H 8 64 H 8 64 I 9 81 | I 9.9 81.09 J 10 100 < +++ File "sheet1" differs from file "sheet2" @end example @noindent and coincides then with the output of @samp{numdiff -f sheet1 sheet2}. The option @option{-O} can be used together with the filter to cope with the addition/deletion of lines. If the file @file{sheet3} contains the text @verbatim A 1 1 C 3.3 9.03 E 5.5 25.05 G 7.7 49.49 I 9.9 81.09 J 10 100.00 K 0 0.02 @end verbatim @noindent then @samp{numdiff -O40 sheet1 sheet3} prints a wrong report, as in the example with files @file{bill1} and @file{bill2}: @example A 1 1 A 1 1 B 2 4 :!: C 3.3 9.03 C 3 9 :!: E 5.5 25.05 D 4 16 :!: G 7.7 49.49 E 5 25 :!: I 9.9 81.09 F 6 36 :!: J 10 100.00 G 7 49 :!: K 0 0.02 H 8 64 :<: *** End of file "sheet3" reached while trying to read line 8. File "sheet1" has more lines than file "sheet3", line 8 is the last one read from file "sheet1" +++ File "sheet1" differs from file "sheet3" @end example On the other hand, the presence of @option{-z @@} makes Numdiff always compare fields of corresponding lines, as shown by the output of the command @samp{numdiff -O40 -z @@ sheet1 sheet3}: @example A 1 1 A 1 1 B 2 4 :<: C 3 9 :!: C 3.3 9.03 D 4 16 :<: E 5 25 :!: E 5.5 25.05 F 6 36 :<: G 7 49 :!: G 7.7 49.49 H 8 64 :<: I 9 81 :!: I 9.9 81.09 J 10 100 J 10 100.00 :>: K 0 0.02 +++ File "sheet1" differs from file "sheet3" @end example Side-by-side format is easy to read, but it has limitations. It generates much wider output than usual, and truncates lines that are too long to fit. Also, it relies on lining up output quite heavily, so its output looks particularly bad if you use varying width fonts, nonstandard tab stops, or nonprinting characters. @node Filter output, Raw output, Overview mode, Overview @section Output of the filter @cindex Filter output (numdiff) The output produced just by running the filter (option @option{-f}) is a side-by-side difference listing of the compared files like the one displayed by GNU sdiff. The files are listed in two columns with a gutter between them. The gutter contains one of the following markers: @table @samp @item white space The corresponding lines are in common. That is, either the lines are identical, or the difference is ignored because of one of the options @option{-s}, @option{-D}, @option{-I}, @option{-X}, @option{-z}, or @option{-Z}. @item | The corresponding lines differ, and they are either both complete or both incomplete. @item < @itemx ( The files differ and only the first file contains the line. @item > @itemx ) The files differ and only the second file contains the line. @item \ The corresponding lines differ, and only the first line is incomplete. @item / The corresponding lines differ, and only the second line is incomplete. @end table An input line is incomplete if its last character is not a newline. This can happen only if the line is the last one of its file. When an output line of the side by side difference listing represents two differing lines, one might be incomplete while the other is not. In this case the gutter is marked @samp{\} if the line from the first file is incomplete, @samp{/} if the line from the second file is it. Like @option{-O}, the option @option{-f} can take an optional argument which allows to set the width of the output and eventually to suppress common lines, @pxref{Invoking numdiff} and @ref{Use of the option -f}. More generally, the user can always make @command{numdiff} avoid to print, partially or totally, the messages that it would otherwise send to standard output. This can be achieved by some suitable command line options, @pxref{Invoking numdiff}. @node Raw output, , Filter output, Overview @section Raw output @cindex Raw output format Since version 5.9 Numdiff can report the results of the comparison of two files in a particularly compact format, which can be easily parsed by other programs. This @emph{raw} format is chosen by Numdiff whenever the user requests it through the command line option @option{--raw}. Below you can see an example of raw output in the case of the comparison of the files @file{list1} and @file{list2} from section @ref{Output format}: @example 1:1:1:1:*:*:accident ==> Accident 1:1:3:3:*:*:23Joshua ==> 23456 1:1:5:5:1.0000000000e-4:2.0000000000e-5:+3+4i ==> +3.0001+4i 1:1:6:*:water 2:2:2:2:9.0200000000e-4:2.6104672633e-7:-3455.321 ==> -3455.320098 2:2:3:3:*:*:cat ==> Cat 2:2:5:5:5.0000000000e-4:8.0256821830e-7:.0005-6.23e2i ==> -6.23e2i 2:2:*:6:$$$ 3:3:*:1:A new line *:4 +++ File "list1" differs from file "list2" @end example The raw format is not at all convenient for humans. It has been provided only for being used by the forthcoming graphic user interface of Numdiff (yes, Numdiff will have a GUI sometime in the future!). @node Installing, Invoking numdiff, Overview, Top @chapter Installing @cindex Install @cindex Compile @cindex Build To successfully compile, build and install Numdiff some tools are required. The first one is an ANSI C compiler. This compiler should at least accept the option @option{-o} to write its output to a specified file, the option @option{-D} for macros predefinition, the option @option{-l} to search for a specified library, and the options @option{-I} and @option{-L} to add a given directory to the search path for include and library files respectively. In addition, you need a POSIX implementation of the @command{make} utility (I used both GNU make and smake by Joerg Schilling to compile Numdiff) and a POSIX implementation of the commands @command{rm} and @command{find}. At last, you need a proper installation of GNU Texinfo (in order to install the info documentation) and a shell sh-compatible. Numdiff has been successfully compiled and tested on: @itemize @item Slackware@registeredsymbol{} GNU/Linux 10.2 with the version 3.3.6 of the GNU C Compiler (GCC), @item Slackware GNU/Linux 11 with GCC 3.4.6, @item Slackware GNU/Linux 12.2 with GCC 4.2.4, @item Slackware GNU/Linux 13 with GCC 4.3.3, @item Debian@registeredsymbol{} GNU/Linux 4.0 with GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21), @item Debian GNU/Linux 6.0.3 with GCC 4.4.5 (Debian 4.4.5-8), @item Debian GNU/Linux 7.1 with GCC 4.7.2 (Debian 4.7.2-5), @item Debian GNU/Linux 8.6 with GCC 4.9.2 (Debian 4.9.2-10), @item SunOS@registeredsymbol{} 5.8 with GCC 2.95.3, and @item SunOS 5.10 (i386) with the version 5.9 of the Sun C compiler. @end itemize Configuration, building and installation of Numdiff can be performed through the standard three steps: @example ./configure make make install @end example @noindent If you leave enabled the Natural Language Support and you also want to install the localization files (at the moment only the Italian localization is supplied), then after @samp{make} you will have to type and run @example make install-nls @end example By default, @samp{make install} will install all the files in @file{/usr/local/bin}, @file{/usr/local/info} etc. You can specify an installation prefix other than @file{/usr/local} using the option @option{--prefix} in the @command{configure} step, for instance @samp{--prefix=$HOME}: @example ./configure --prefix=$HOME @end example @noindent For better control, you can use the options @option{--bindir}, @option{--infodir}, and so on. Type @samp{./configure --help} to obtain the complete list of all available options. The documentation files (including a full User Manual available in HTML, PDF and plain ASCII text format) will always be put in @file{@var{DOCDIR}/numdiff}, where @var{DOCDIR} is the path specified by the option @option{--docdir} or, if this option has not been given to @command{configure}, @file{@var{PREFIX}/local/doc}. Here @var{PREFIX} is the installation prefix specified by the option @option{--prefix} or the default @file{/usr/local}. Once Numdiff has been installed you can remove all files related to Numdiff by a simple @samp{make uninstall}. If you have also installed the localization files trough @samp{make install-nls}, use @samp{make uninstall-nls} in place of @samp{make uninstall} to remove them too. Between the options accepted by @command{configure} there are @option{--enable-debug}, @option{--enable-optimization}, @option{--enable-nls} and @option{--enable-gmp}. The option @option{--enable-debug} turns on debugging when compiling the source code. This is obtained by passing to the compiler the @option{-g} option, but you can change this default debugging flag (which could not even be recognized by your compiler) by setting the environment variable @env{DBGFLAGS} before launching @command{configure}. The option @option{--enable-optimization} turns on basic optimization when compiling the source code. This is obtained by passing to the compiler the @option{-O} option, but you can change this default flag (which could not even be recognized by your compiler) by setting the environment variable @env{OPTFLAGS} before launching @command{configure}. The option @option{--enable-nls} turns on Natural Language Support. You do not need to use it explicitly since Natural Language Support is enabled by default. To disable it, use @option{--disable-nls}. Disabling Natural Language Support is suggested whenever you want to install Numdiff on a system where the GNU gettext library is not present. In this case the installation of Numdiff can be accomplished, for example, through @example ./configure --disable-nls make make install @end example @noindent Since version 5.2.0 Numdiff uses to perform all computations the GNU Multiple Precision Arithmetic Library (also called GNU MP or GMP), if this library is available at build-time. The old internal support for multiple precision arithmetic is a fall-back in case GNU MP is absent. However, it is possible to use the internal support for multiple precision arithmetic even if GNU MP is available: it is sufficient to pass the option @option{--enable-gmp=no} or @option{--disable-gmp} to the configure script before building the program, like in @example ./configure --disable-gmp make make install @end example @noindent Enabling the old internal support for multiple precision arithmetic is deprecated, @pxref{with GNU MP is better}. The latest version of GNU MP is available at @uref{http://ftp.gnu.org/gnu/gmp/}. See the GNU MP web page at @uref{http://gmplib.org/} for up-to-date information on GNU MP. @node Invoking numdiff, ndselect, Installing, Top @chapter Invoking numdiff @cindex Invoking numdiff @cindex Options, command line (numdiff) @cindex Command line options for numdiff @cindex Synopsis (numdiff) @cindex Diagnostics (numdiff) @cindex Predefined settings of numdiff @strong{SYNOPSIS} @example numdiff -h|--help|-v|--version @end example or @example numdiff [-s @var{IFS}][-D @var{DELIMS}][-a @var{THRVAL}[:@var{RANGE}|:@var{RANGE1}:@var{RANGE2}]] [-r @var{THRVAL}[:@var{RANGE}|:@var{RANGE1}:@var{RANGE2}]][-2][-F @var{NUM}][-# @var{NUM}][-P][-N][-I] [-c @var{CURRNAME}][-d @var{C1C2}][-t @var{C1C2}][-g @var{N1N2}][-p @var{C1C2}][-n @var{C1C2}][-e @var{C1C2}] [-i @var{C1C2}][-X 1:@var{RANGE}][-X 2:@var{RANGE}][-E][-U][-b][-V][-O[@var{NUM}]][--raw][-q][-S] [-z 1:@var{RANGE}][-z 2:@var{RANGE}][-Z 1:@var{RANGE}][-Z 2:@var{RANGE}][-m][-H][-f[@var{NUM}]] [-T][-B][-l @var{PATH}][-o @var{PATH}] @var{FILE1} @var{FILE2} @end example @noindent where @var{FILE1} and @var{FILE2} are the names of the two files to compare and @var{RANGE}, @var{RANGE1} and @var{RANGE2} stay for a positive integer value or for a range of integer values, like @samp{1-}, @samp{3-5} or @samp{-7}. In the first case @command{numdiff} prints a short help (not so short actually :)) or/and version number, Copyright, License notice, NO-Warranty disclaimer, and some information about the way it was built. In the second case @command{numdiff} compares the files specified by the two mandatory arguments which follow the list of the options. The complete paths of the files should be given, a directory name is not accepted. In addition, the two arguments cannot refer to the same file but one of them can be @verb{|-|}, which refers to stdin. @noindent @strong{OPTIONS} @table @option @item -s, --separators=@var{IFS} Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline). If @var{IFS} is prefixed with @samp{1:} or @samp{2:}, use the given delimiter set only for the lines from the first or the second file respectively @item -D, --delimiters=@var{DELIMS} Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline). If @var{DELIMS} is prefixed with @samp{1:} or @samp{2:}, use the given delimiter set only for the lines from the first or the second file respectively @item -a, --absolute-tolerance=@var{THRVAL}[:@var{RANGE}|:@var{RANGE1}:@var{RANGE2}] Set to @var{THRVAL} the maximum absolute difference permitted before two numeric fields are regarded as different (The default value is zero). If a @var{RANGE} is given, use the specified threshold only when comparing fields whose indexes lie in @var{RANGE}. If both @var{RANGE1} and @var{RANGE2} are given and have the same length, then use the specified threshold when comparing a field of @var{FILE1} lying in @var{RANGE1} with the corresponding field of @var{FILE2} in @var{RANGE2} @item -r, --relative-tolerance=@var{THRVAL}[:@var{RANGE}|:@var{RANGE1}:@var{RANGE2}] Set to @var{THRVAL} the maximum relative difference permitted before two numeric fields are regarded as different (The default value is zero). If a @var{RANGE} is given, use the specified threshold only when comparing fields whose indexes lie in @var{RANGE}. If both @var{RANGE1} and @var{RANGE2} are given and have the same length, then use the specified threshold when comparing a field of @var{FILE1} lying in @var{RANGE1} with the corresponding field of @var{FILE2} in @var{RANGE2} @item -2, --strict Consider two numerical values as equal only if both absolute and relative difference do not exceed the respective tolerance threshold @item -F, --formula=@var{NUM} Use the formula indicated by @var{NUM} to compute the relative errors. If @var{NUM} is 0 use the classic formula. If @var{NUM} is 1 compute the relative errors by considering the values in @var{FILE1} as sample values. If @var{NUM} is 2 compute the relative errors by considering the values in @var{FILE2} as sample values. @item -#, --digits=@var{NUM} Set to @var{NUM} the number of digits in the significands used in multiple precision arithmetic @item -P, --positive-differences Ignore all differences due to numeric fields of the second file that are less than the corresponding numeric fields in the first file @item -N, --negative-differences Ignore all differences due to numeric fields of the second file that are greater than the corresponding numeric fields in the first file @item -I, --ignore-case Ignore changes in case while doing literal comparisons @item -c, --currency=@var{CURRNAME} Set to @var{CURRNAME} the currency name for the two files to compare. @var{CURRNAME} must be prefixed with @samp{1:} or @samp{2:} to specify the currency name only for the first or the second file @item -d, --decimal-point=@var{C1C2} Specify the characters representing the decimal point in the two files to compare @item -t, --thousands-separator=@var{C1C2} Specify the characters representing the thousands separator in the two files to compare @item -g, --group-length=@var{N1N2} Specify the number of digits forming each group of thousands in the two files to compare @item -p, --plus-prefix=@var{C1C2} Specify the (optional) prefixes for positive values used in the two files to compare @item -n, --minus-prefix=@var{C1C2} Specify the prefixes for negative values used in the two files to compare @item -e, --exponent-letter=@var{C1C2} Specify the exponent letters used in the two files to compare @item -i, --imaginary-unit=@var{C1C2} Specify the characters representing the imaginary unit in the two files to compare @item -X, --exclude=1:@var{RANGE} Select the fields of the first file that have to be ignored @item -X, --exclude=2:@var{RANGE} Select the fields of the second file that have to be ignored @item -E, --essential While printing the differences between the two compared files show only the numerical ones @item -U, --dummy While printing the differences between the two compared files neglect all the numerical ones (dummy mode) @item -b, --brief Suppress all messages concerning the differences discovered in the structures of the two files @item -V, --verbose For every couple of lines which differ in at least one field print an header to show how these lines appear in the two compared files @item -O, --overview[=@var{NUM}] Display a side by side difference listing of the two files showing which lines are present only in one file, which lines are present in both files but with one or more differing fields, and which lines are identical. If @var{NUM} is zero or is not specified, output at most 130 columns per line. If @var{NUM} is a positive number, output at most @var{NUM} columns per line. If @var{NUM} is a negative number, do not output common lines and display at most -@var{NUM} columns per line. @item --raw Display the differences between the two compared files in raw format (not very convenient for humans) @item -q, --quiet, --silent Suppress all the standard output @item -S, --statistics Add some statistics to the standard output @item -z, --blur-if-numerical=1:@var{RANGE} Select the fields of the first file that have to be blurred during the synchronization procedure only if they turn out to be numeric @item -z, --blur-if-numerical=2:@var{RANGE} Select the fields of the second file that have to be blurred during the synchronization procedure only if they turn out to be numeric @item -Z, --blur-unconditionally=1:@var{RANGE} Select the fields of the first file that have to be unconditionally blurred during the synchronization procedure @item -Z, --blur-unconditionally=2:@var{RANGE} Select the fields of the second file that have to be unconditionally blurred during the synchronization procedure @item -m, --minimal During synchronization try hard to find a smaller set of changes @item -H, --speed-large-files During synchronization assume large files and many scattered small changes @item -f, --test-filter[=@var{NUM}] Run only the filter and then show the results of its attempt to synchronize the two files. If @var{NUM} is zero or is not specified, output at most 130 columns per line. If @var{NUM} is a positive number, output at most @var{NUM} columns per line. If @var{NUM} is a negative number, do not output common lines and display at most -@var{NUM} columns per line. @item -T, --expand-tabs Expand tabs to spaces in output while displaying the results of the synchronization procedure (meaningful only together with option @option{-O} or @option{-f}) @item -B, --binary Treat both files as binary files (only meaningful under Doz/Windoz) @item -l, --warnings-to=@var{PATH} Redirect warning and error messages from stderr to the indicated file @item -o, --output=@var{PATH} Redirect output from stdout to the indicated file @item -h, --help Show help message and predefined settings @item -v, --version Show version number, Copyright, Distribution Terms and NO-Warranty @end table @noindent @strong{DIAGNOSTICS} The exit status is 1 if the two given files differ, 0 if they are equal, -1 (255) in case of error. @noindent @strong{DEFAULT NUMERIC FORMAT (for both files to compare):} @anchor{Default Numeric Format} Currency name = "" @sp 1 Decimal point = `.' @sp 1 Thousands separator = `,' @sp 1 Number of digits in each thousands group = 3 @sp 1 Leading positive sign = `+' @sp 1 Leading negative sign = `-' @sp 1 Prefix for decimal exponent = `e' @sp 1 Symbol used to denote the imaginary unit = `i' @noindent @strong{SOME EXPLANATIONS} The options @option{-U}, @option{-E}, @option{-b}, and @option{-q} are used to hide part of the standard output of the program according to certain rules. The option @option{-U} triggers the @i{dummy mode}. In this mode @command{numdiff} does not print the numerical differences. A numerical difference occurs whenever the compared fields turn out to be both of numerical type, but the field from the second file has a value which differs from the one of the field from the first file. The @i{dummy mode} is so called since in this mode @command{numdiff} does not perform the job for which I created it. The option @option{-E} triggers the @i{essential mode}. In this mode @command{numdiff} only prints the numerical differences between the files and, if there are some, the differences in the structure. The latter ones occur either when one of the files contains a line for which there is no corresponding line in the other file, or when the comparison of corresponding lines shows that one of them contains a field for which there exists no corresponding field in the other line. If you are not running any filter or cutting out any fields through the option @option{-X}, then the differences in the structure simply consist either in a different number of lines in the two files, or in a different number of fields on a line. The option @option{-b} triggers the @i{brief mode}. In this mode @command{numdiff} does not print the differences in the structure of the two files (see above for an explanation about what differences in the structure are). The option @option{-q} triggers the @i{quiet mode}. In this mode @command{numdiff} does not print anything on the standard output. The @i{quiet mode} is useful if you only want to know whether a couple of files are equal or not. This information can be obtained by looking at the exit status of the program. The option @option{-O} activates the @i{overview mode}, which makes @command{numdiff} print a side-by-side report in the form described in section @ref{Overview mode}. The optional numeric argument after @option{-O} must immediately follow, intermediate spaces are not allowed. The option @option{-O} can be used together with any other option of Numdiff except for @option{-f}, @option{-q}, @option{-U}, @option{-E}, @option{-V}, @option{-b}, and @option{--raw}. Whenever @option{-O} is in use, @option{-U}, @option{-E}, @option{-V} and @option{-b} are ignored. If @option{--raw} or @option{-q} is present on the command line together with @option{-O}, then @option{-O} is ignored. Finally, if both @option{-f} and @option{-O} are present, the behavior of Numdiff will depend on their order: the option which appears first on the command line is the one which matters. The option @option{-V} triggers the @i{verbose mode}. In this mode @command{numdiff} produces a richer report by printing an header whenever the compared lines differ. The header shows how and where these lines appear in the compared files. For instance, if the files @file{data1} and @file{data2} contain the data @verbatim 12 33 22 44.5 0.008 1.002 221.12 -34.56 water 2101.21 boats @end verbatim @noindent and @verbatim 12 33 22.3 44.5 0.008 1.202 221.12 -34.56 2101.21 boats dogs @end verbatim @noindent respectively, then the command @samp{numdiff -V data1 data2} will print the following output: @example ---------------- ##2 <== 22 44.5 ##2 ==> 22.3 44.5 ##2 #:1 <== 22 ##2 #:1 ==> 22.3 @@ Absolute error = 3.0000000000e-1, Relative error = 1.3636363636e-2 ---------------- ##3 <== 0.008 1.002 ##3 ==> 0.008 1.202 ##3 #:2 <== 1.002 ##3 #:2 ==> 1.202 @@ Absolute error = 2.0000000000e-1, Relative error = 1.9960079840e-1 ---------------- ##4 <== 221.12 -34.56 water ##4 ==> 221.12 -34.56 ##4 #>3 <== water ##4 ==> @@ Line 4 in file "data2" is shorter than expected! ---------------- ##5 <== 2101.21 boats ##5 ==> 2101.21 boats dogs ##5 <== ##5 #>3 ==> dogs @@ Line 5 in file "data1" is shorter than expected! +++ File "data1" differs from file "data2" @end example Mind that the options @option{-b} and @option{-V} will be overridden if @option{-q} is also set. The amount of additional information printed by @option{-V} is trivially influenced by the options that alter the way @command{numdiff} performs the comparisons between fields (for instance @option{-a}, @option{-r}, @option{-2}, @option{-N}, @option{-P}, @option{-U}, @option{-E}, @option{-I}, @option{-X}). In the headers printed by @command{numdiff} in ``verbose mode'' the symbol @verb{|<<*>>|} can appear. This symbol, if present, is always located at the end of a line to mean that the line is at the end of the corresponding file and does not have a terminating @strong{newline} character. The option @option{-S} adds to the standard output of @command{numdiff} a statistical report with the following information: @itemize @item the number of numeric comparisons the program has done (this quantity, like the successive ones, is influenced by the options @option{-P} and @option{-N}) and the number of those ones whose outcome is a major @footnote{By major numerical differences and major errors I mean those ones listed in the output of @command{numdiff} if none of the options @option{-U}, @option{-f}, @option{-O}, and @option{-q} is used.} numerical difference. @item the largest absolute error in the set of major numerical differences together with the corresponding relative error, and the positions of its first occurrences in the compared files, @item the largest relative error in the set of major numerical differences together with the corresponding absolute error, and the positions of its first occurrences in the compared files, @item the sum and the arithmetic mean of all absolute errors, @item the sum and the arithmetic mean of the major absolute errors, @item the square root of the sum of the squares of all absolute errors, @item the square root of the sum of the squares of the major absolute errors, @item the quadratic mean of all absolute errors, and @item the quadratic mean of the major absolute errors. @end itemize The information printed by @option{-S} is not removed if this option is used together with @option{-q}, and is not influenced by the option @option{--raw}. The options @option{-a}, @option{-r}, @option{-2}, @option{-P} and @option{-N} affect the way @command{numdiff} performs the comparisons between numerical values. Without any of these options, @command{numdiff} considers two numerical fields as equal if their difference is zero. The option @option{-a} can be used to make two numerical fields be considered equal as long as their absolute difference does not exceed a certain threshold, which is specified by the argument that follows the @option{-a} option. This argument can take several forms. The basic form consists of a single numerical value, the extended form adds the specification of one or two ranges of integer values. Independently of the form of the argument, if the absolute difference between two fields does not exceed the given threshold value, the fields are considered equal; otherwise, @command{numdiff} prints the difference in its report, unless some other option, for example @option{-P} or @option{-N}, makes the difference be neglected. If nothing else follows the threshold value, the rule just explained applies to all comparisons between numerical fields. To see this in practice, if the file @file{many_columns1} contains the text @verbatim A 1 1.2 1 0.1 11.0 1.0e-1 B 2 2.4 4 0.4 24.0 1.0e-2 C 3 3.6 9 0.9 39.0 1.0e-3 D 4 4.8 16 1.6 416.0 1.0e-4 @end verbatim @noindent and the contents of the file @file{many_columns2} are given by @verbatim A 1.1 1.08 1.01 0.1 11.011 -1.0e-1 B 2.2 2.16 4.04 0.4 24.024 -1.0e-2 C 3.3 3.24 9.09 0.9 39.039 -1.0e-3 D 4.4 4.32 16.16 1.6 416.039 -1.0e-4 @end verbatim @noindent then the output of the command @samp{numdiff -a 0.5 many_columns1 many_columns2} will be @example +++ Files "many_columns1" and "many_columns2" are equal @end example @noindent The highest absolute difference between a field from @file{many_columns1} and the corresponding field from @file{many_columns2} is given indeed by |4.32 - 4.8| = |-0.48| = 0.48, and then all numeric differences between the two files remain below the threshold value 0.5. On the other hand, the command @samp{numdiff -a 0.35 many_columns1 many_columns2} prints the report @example ---------------- ##3 #:3 <== 3.6 ##3 #:3 ==> 3.24 @ Absolute error = 3.6000000000e-1, Relative error = 1.1111111111e-1 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:3 <== 4.8 ##4 #:3 ==> 4.32 @ Absolute error = 4.8000000000e-1, Relative error = 1.1111111111e-1 +++ File "many_columns1" differs from file "many_columns2" @end example @noindent since the absolute differences |3.24-3.6| = |-0.36| = 0.36, |4.4-4| = |0.4| = 0.4, and |4.32 - 4.8| = 0.48 exceed the value 0.35, while the other differences are below this threshold. If you want that the specified threshold value applies only when comparing some particular fields, you have to use the extended form for the argument of @option{-a}. This means that after the threshold value one or two ranges of integer numbers must follow, each preceded by a colon (`:'). If you specify only one range of numbers after the threshold value, @command{numdiff} uses the given threshold only when comparing fields whose positions lie in the specified range. Remember that the positions of the fields on a line are numbered starting from the left hand of the line and proceeding towards the right hand. For example, @samp{-a 0.01:2-5} sets the threshold value to 0.01 only for the comparisons between numerical fields which occupy on their lines a position between the second and the fifth one inclusive. For the other comparisons the threshold value is left unchanged; in particular, it is equal to zero if it has not been explicitly set. If the files @file{many_columns1} and @file{many_columns2} are the same as before, then the command @samp{numdiff -a 0.5:3-6 many_columns1 many_columns2} will display the following report @example ---------------- ##1 #:2 <== 1 ##1 #:2 ==> 1.1 @ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 @ Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:2 ==> 2.2 @ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 @ Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:7 <== 1.0e-3 ##3 #:7 ==> -1.0e-3 @ Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:7 <== 1.0e-4 ##4 #:7 ==> -1.0e-4 @ Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns2" @end example @noindent since the threshold value 0.5 applies now only when comparing fields in third, fourth, fifth and sixth position, while for the other comparisons the threshold value is the default one, i.e. zero. If you want to specify a non null threshold also for the fields in second and seventh position, you can do it by using the option @option{-a} more times. The command @samp{numdiff -a 0.5:3-6 -a 0.25:2 -a 4e-3:7 many_columns1 many_columns2} sets the threshold value to 0.25 for the comparisons between the fields in second position, and to 4e-3 for the comparisons of the fields in seventh position. No wonder then, that the command prints exactly this report: @example ---------------- ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 @ Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 @ Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 +++ File "many_columns1" differs from file "many_columns2" @end example @noindent Observe that @verb{|:2|} and @verb{|:7|} are abbreviations of @verb{|:2-2|} and @verb{|:7-7|}, respectively. It is even possible to use range expressions like @samp{@var{m}-} or @samp{-@var{n}}. The first expression means all fields starting from the @var{m}th one (inclusive) till to the end of line, the second selects all fields from the first one till to the @var{n}th one, both inclusive. If you specify two ranges of numbers after the threshold value and they have the same length (the length of a range is the difference between its maximum and its minimum), @command{numdiff} uses the given threshold when comparing a field of the first file lying in the first range with the corresponding field of the second file from the second range. For example, @samp{-a 1e-4:3-5:4-6} sets the threshold value to 0.0001 only for the numerical comparisons of the third, fourth, and fifth field of each line from the first file with the fourth, fifth and sixth field respectively of the corresponding line from the second file. For the other comparisons the threshold value is left unchanged and is in particular equal to zero if it has not been explicitly set. This way to restrict the application of a threshold value is useful in conjunction with the option @option{-X}, which makes @command{numdiff} ignore one or more fields from one of the compared files. The file @file{many_columns3}: @verbatim A I 1.1 1.08 1.01 0.1 11.011 -1.0e-1 B II 2.2 2.16 4.04 0.4 24.024 -1.0e-2 C III 3.3 3.24 9.09 0.9 39.039 -1.0e-3 D IV 4.4 4.32 16.16 1.6 416.039 -1.0e-4 @end verbatim @noindent has one column more than the file @file{many_columns1}, namely the second one. When comparing @file{many_columns1} with @file{many_columns3} it is natural then to ignore the second column of the second file. This can be achieved by passing the argument 2:2 to the option @option{-X} (for a full description of the use of this option, @pxref{Restriction of the comparison to particular fields}). Ignoring the second field of each line of @file{many_columns3} implies that the fields in the third column of this file are compared with the corresponding fields of the second column of @file{many_columns1}, the fields in the fourth column of @file{many_columns3} are compared with the ones in the third column of @file{many_columns1}, and so on. Therefore, if you want to set a threshold value only for the comparisons between some particular fields you have to consider that @samp{-X 2:2} makes @command{numdiff} compare the first, second, third, fourth, fifth, sixth, and seventh field of each line of @file{many_columns1} with the first, third, fourth, fifth, sixth, seventh, and eighth field respectively of the corresponding line of @file{many_columns3}. Therefore, the command @samp{numdiff -X 2:2 -a 0.5:3-6 many_columns1 many_columns3} will use 0.5 as threshold value only when comparing the third, fourth, and fifth field of a line from @file{many_columns1} with the fourth, fifth, and sixth field respectively of the corresponding line of @file{many_columns3}. This explains why the report of @samp{numdiff -X 2:2 -a 0.5:3-6 many_columns1 many_columns3} @example ---------------- ##1 #:2 <== 1 ##1 #:3 ==> 1.1 @ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:6 <== 11.0 ##1 #:7 ==> 11.011 @ Absolute error = 1.1000000000e-2, Relative error = 1.0000000000e-3 ##1 #:7 <== 1.0e-1 ##1 #:8 ==> -1.0e-1 @ Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:3 ==> 2.2 @ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:6 <== 24.0 ##2 #:7 ==> 24.024 @ Absolute error = 2.4000000000e-2, Relative error = 1.0000000000e-3 ##2 #:7 <== 1.0e-2 ##2 #:8 ==> -1.0e-2 @ Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:3 ==> 3.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:6 <== 39.0 ##3 #:7 ==> 39.039 @ Absolute error = 3.9000000000e-2, Relative error = 1.0000000000e-3 ##3 #:7 <== 1.0e-3 ##3 #:8 ==> -1.0e-3 @ Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:3 ==> 4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:6 <== 416.0 ##4 #:7 ==> 416.039 @ Absolute error = 3.9000000000e-2, Relative error = 9.3750000000e-5 ##4 #:7 <== 1.0e-4 ##4 #:8 ==> -1.0e-4 @ Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns3" @end example @noindent does not show the same difference listing of the command @samp{numdiff -a 0.5:3-6 many_columns1 many_columns2}. If what you want is to obtain the same difference listing of @samp{numdiff -a 0.5:3-6 many_columns1 many_columns2}, then the right command is @samp{numdiff -X 2:2 -a 0.5:3-6:4-7 many_columns1 many_columns3}. The report printed by this last command is indeed @example ---------------- ##1 #:2 <== 1 ##1 #:3 ==> 1.1 @ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:8 ==> -1.0e-1 @ Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:3 ==> 2.2 @ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:8 ==> -1.0e-2 @ Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:3 ==> 3.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:7 <== 1.0e-3 ##3 #:8 ==> -1.0e-3 @ Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:3 ==> 4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:7 <== 1.0e-4 ##4 #:8 ==> -1.0e-4 @ Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns3" @end example @noindent and up to the positions of the fields from @file{many_columns3} coincides with the one of @samp{numdiff -a 0.5:3-6 many_columns1 many_columns2}. The option @option{-a} can appear more times on the command line. In case of conflicts, the last setting is the one which matters. If you look at the report of the command @samp{numdiff -a 0.5:3-6 -a 0.08:4 many_columns1 many_columns2} @example ---------------- ##1 #:2 <== 1 ##1 #:2 ==> 1.1 @ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:7 <== 1.0e-1 ##1 #:7 ==> -1.0e-1 @ Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e+0 ---------------- ##2 #:2 <== 2 ##2 #:2 ==> 2.2 @ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:7 <== 1.0e-2 ##2 #:7 ==> -1.0e-2 @ Absolute error = 2.0000000000e-2, Relative error = 2.0000000000e+0 ---------------- ##3 #:2 <== 3 ##3 #:2 ==> 3.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:4 <== 9 ##3 #:4 ==> 9.09 @ Absolute error = 9.0000000000e-2, Relative error = 1.0000000000e-2 ##3 #:7 <== 1.0e-3 ##3 #:7 ==> -1.0e-3 @ Absolute error = 2.0000000000e-3, Relative error = 2.0000000000e+0 ---------------- ##4 #:2 <== 4 ##4 #:2 ==> 4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:4 <== 16 ##4 #:4 ==> 16.16 @ Absolute error = 1.6000000000e-1, Relative error = 1.0000000000e-2 ##4 #:7 <== 1.0e-4 ##4 #:7 ==> -1.0e-4 @ Absolute error = 2.0000000000e-4, Relative error = 2.0000000000e+0 +++ File "many_columns1" differs from file "many_columns2" @end example @noindent you see that 0.08 and not 0.5 is taken as threshold value for the comparison of the fields in fourth position. Finally, if @option{-a} is not present on the command line, then the default threshold value of zero applies to all comparisons of numerical fields and any non null absolute difference is considered as significant, unless some other option, for example @option{-P} or @option{-N}, makes @command{numdiff} ignore it. The option @option{-r} can be used to make two numerical fields be considered equal as long as their relative difference does not exceed a certain threshold, which is specified by the argument that follows the @option{-r} option. As for the option @option{-a}, the argument of @option{-r} can have several forms. These forms are the same accepted by @option{-a} and have the same meanings, but the threshold value applies to the relative difference, not to the absolute one. The relative difference is normally defined in this way. If @emph{n1} is a value from the file specified as first on the command line and @emph{n2} is the corresponding value from the second file, then the absolute difference is given by the formula @emph{A=|n1-n2|}. The relative difference @emph{R} is given by: @itemize @item @emph{R = 0} if @emph{n1} and @emph{n2} are equal, @item @emph{Inf} (infinity) if @emph{n2} differs from @emph{n1} and at least one of them is zero, @item @emph{R = A/ min(|n1|, |n2|)} if @emph{n1} and @emph{n2} are both non zero and @emph{n2} differs from @emph{n1}. @emph{min(|n1|, |n2|)} denotes the minimum between the absolute value of @emph{n1} and the absolute value of @emph{n2}. @end itemize @noindent With this definition of relative difference it turns out that @emph{R(n2, n1) = R(n1, n2)}: the relative difference does not change if you only change the ordering of the compared files on the command line. @anchor{Alternative formulas for the computation of the relative difference} There are cases when this default definition of relative error makes no sense. This can happen for instance when one of the files is a sample file containing a list of expected data, which could have been computed theoretically or come from experiments in a laboratory. In this case it is more natural to define the relative difference as the ratio between the absolute difference and the absolute value of the number coming from the sample file. If you use the option @option{-F} together with the argument 1 (or 2), then Numdiff always compute the relative difference as the ratio between the absolute difference and the absolute value of the number from the first file (the second file, respectively). More precisely, with @samp{-F 1} the relative difference @emph{R} is computed according to these rules: @itemize @item @emph{R = 0} if @emph{n1} and @emph{n2} are equal, @item @emph{Inf} (infinity) if @emph{n2} differs from @emph{n1} and @emph{n1} is zero, @item @emph{R = |n1-n2|/ |n1|} if @emph{n1} is not zero and @emph{n2} differs from @emph{n1}. @end itemize @noindent With @samp{-F 2} the rules become: @itemize @item @emph{R = 0} if @emph{n1} and @emph{n2} are equal, @item @emph{Inf} (infinity) if @emph{n2} differs from @emph{n1} and @emph{n2} is zero, @item @emph{R = |n1-n2|/ |n2|} if @emph{n2} is not zero and @emph{n2} differs from @emph{n1}. @end itemize @noindent With the last two sets of rules it is not anymore true that @emph{R(n2, n1) = R(n1, n2)}: the relative difference changes, in the general case, together with the ordering of the files on the command line. As a simple example, suppose that @var{file1} and @var{file2} contain @verbatim 1 9.9 0.5 440 @end verbatim @noindent and @verbatim 1.2 8 0.51 400 @end verbatim @noindent respectively. Then @samp{numdiff @var{file1} @var{file2}} displays @example ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 @ Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 @ Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 @ Absolute error = 1.0000000000e-2, Relative error = 2.0000000000e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 @ Absolute error = 4.0000000000e+1, Relative error = 1.0000000000e-1 +++ File "file1" differs from file "file2" @end example @noindent @samp{numdiff -F 1 @var{file1} @var{file2}} prints @example ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 @ Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 @ Absolute error = 1.9000000000e+0, Relative error = 1.9191919192e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 @ Absolute error = 1.0000000000e-2, Relative error = 2.0000000000e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 @ Absolute error = 4.0000000000e+1, Relative error = 9.0909090909e-2 +++ File "file1" differs from file "file2" @end example @noindent the output of @samp{numdiff -F 2 @var{file1} @var{file2}} is @example ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 @ Absolute error = 2.0000000000e-1, Relative error = 1.6666666667e-1 ##1 #:2 <== 9.9 ##1 #:2 ==> 8 @ Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 ##1 #:3 <== 0.5 ##1 #:3 ==> 0.51 @ Absolute error = 1.0000000000e-2, Relative error = 1.9607843137e-2 ##1 #:4 <== 440 ##1 #:4 ==> 400 @ Absolute error = 4.0000000000e+1, Relative error = 1.0000000000e-1 +++ File "file1" differs from file "file2" @end example @noindent @samp{numdiff -F 1 -r 0.195 @var{file1} @var{file2}} displays @example ---------------- ##1 #:1 <== 1 ##1 #:1 ==> 1.2 @ Absolute error = 2.0000000000e-1, Relative error = 2.0000000000e-1 +++ File "file1" differs from file "file2" @end example @noindent and finally, @samp{numdiff -F 2 -r 0.195 @var{file1} @var{file2}} displays @example ---------------- ##1 #:2 <== 9.9 ##1 #:2 ==> 8 @ Absolute error = 1.9000000000e+0, Relative error = 2.3750000000e-1 +++ File "file1" differs from file "file2" @end example @noindent The option @option{-2} is only meaningful when the user specifies a non-zero tolerance threshold for both absolute and relative difference. Without this option @command{numdiff} considers two numerical fields equal as long as at least one between absolute and relative difference does not exceed the corresponding threshold. With the option @option{-2} @command{numdiff} regards two numerical fields as equal only if both absolute and relative difference do not exceed the thresholds of tolerance specified for those fields. For example, if @var{file1} contains the unique line @verbatim 100 @end verbatim @noindent and @var{file2} the line @verbatim 100.00012 @end verbatim @noindent then the output of the command @samp{numdiff @var{file1} @var{file2}} will be @example ---------------- ##1 #:1 <== 100 ==> 100.00012 @@ Absolute error = 1.2000000000e-4, Relative error = 1.2000000000e-6 +++ File "@var{file1}" differs from file "@var{file2}" @end example @noindent The output of the commands @samp{numdiff -a 1.0e-4 @var{file1} @var{file2}} and @samp{numdiff -r 1.0e-6 @var{file1} @var{file2}} will be the same as above, but @samp{numdiff -a 1.0e-4 -r 1.3e-6 @var{file1} @var{file2}} and @samp{numdiff -a 1.3e-4 -r 1.0e-6 @var{file1} @var{file2}} will print the message @example +++ Files "@var{file1}" and "@var{file2}" are equal @end example @noindent since the relative difference is 1.2e-6 < 1.3e-6, the absolute difference is 1.2e-4 < 1.3e-4, and it is sufficient that one of them does not exceed its tolerance threshold. On the other hand, the commands @samp{numdiff -a 1.0e-4 -r 1.3e-6 -2 @var{file1} @var{file2}} and @samp{numdiff -a 1.3e-4 -r 1.0e-6 -2 @var{file1} @var{file2}} will both print the message @example ---------------- ##1 #:1 <== 100 ==> 100.00012 @@ Absolute error = 1.2000000000e-4, Relative error = 1.2000000000e-6 +++ File "@var{file1}" differs from file "@var{file2}" @end example @noindent since the option @option{-2} makes @command{numdiff} regard two values as equal only if both absolute and relative difference do not exceed the respective threshold of tolerance. The option @option{-P} makes @command{numdiff} consider two values equal whenever the second one, i.e. the value coming from the file specified as last on the command line, is less or equal than the first one, which is the value coming from the file specified as first on the command line. If the values to compare are complex numbers, saying that the second one is less or equal than the first one means that both real and imaginary part of the second value are not greater than real and imaginary part of the first value, respectively. Finally, the option @option{-N} makes @command{numdiff} consider two values equal whenever the second one, i.e. the value coming from the file specified as last on the command line, is greater or equal than the first one, which is the value coming from the file specified as first on the command line. If the values to compare are complex numbers, saying that the second one is greater or equal than the first one means that both real and imaginary part of the second value are not less than real and imaginary part of the first value, respectively. The options @option{-B}, @option{-I}, @option{-l}, @option{-o}, @option{-h}, and @option{-v} do not require further explanations. The options @option{-l} and @option{-o} are only supplied for the users of poorly designed operating systems, whose default shell does not allow the redirection of standard error and standard output. The option @option{-I} has no effect on the outcome of numerical comparisons but affects the action of the filter, @pxref{Filtering}. The option @option{-s} requires as argument a set of characters, which will be taken as field delimiters. It is better to quote the set of the delimiters, just as in the next examples: @example numdiff -s ' \t\n,;:.' @var{file1} @var{file2} numdiff -s ' \t\n\r\f\v"\:;' @var{file1} @var{file2} numdiff -s `` \t\n''' @var{file1} @var{file2} @end example @noindent If you want to include in the set of delimiters also some special characters, e.g. the @strong{blank}, then you must quote it. I recommend you to always use the single quote character (@verb{|'|}) to enclose the list of the delimiters, since in this way you will prevent any substitution or handling of characters by the shell. @noindent @command{numdiff} recognizes and interprets the following sequences of characters within the argument passed to the option @option{-s}: @itemize @item @samp{\a} alert (bell), @item @samp{\b} backspace, @item @samp{\f} form feed, @item @samp{\n} newline, @item @samp{\r} carriage return, @item @samp{\s} blank, @item @samp{\t} horizontal tab, @item @samp{\v} vertical tab, @item @samp{\\} backslash, @item @samp{\@var{nnn}} the eight-bit character whose value is the octal value @var{nnn} (one to three digits), @item @samp{\x@var{HH}} the eight-bit character whose value is the hexadecimal value @var{HH} (one or two digits). @end itemize @noindent Thus, by passing the string @samp{ \t\n,;:.} as argument for the option @option{-s} one tells @command{numdiff} to use as field delimiters the characters @strong{blank}, @strong{horizontal tab}, @strong{newline}, @strong{comma}, @strong{semicolon}, @strong{colon}, and @strong{dot}. Passing @samp{ \t\n} as argument to the option @option{-s} is the same as not using at all the option @option{-s}, since @strong{blank}, @strong{horizontal tab}, and @strong{newline} are the default field delimiters. In the list of field delimiters the character @strong{backslash} (@samp{\}) is always treated in a special way. If it forms, combined with the subsequent character(s), one of the escape sequences listed above, then it is considered to be an escape character, and the whole escape sequence is decoded as shown above. Otherwise, the @strong{backslash} is just ignored. Therefore, the delimiters specified by the command line @example numdiff -s' \t\n\\\"' @var{file1} @var{file2} @end example @noindent are @strong{blank}, @strong{horizontal tab}, @strong{newline}, @strong{backslash} and @strong{double quote}, since @samp{\\} and @samp{\"} are interpreted by @command{numdiff} as @samp{\} and @samp{"}. Even if I have recommended to enclose the set of delimiters in single quotes, there are cases in which you will be forced to use the double quote character (@samp{"}) to enclose the set of field delimiters, e.g. if the single quote character is used itself as field delimiter, like in one of the precedent examples. However, you must take into account that in this case the shell could make some substitutions on the command line before executing @command{numdiff}. For instance, if your shell is GNU bash, then (citing the man page of GNU bash) @quotation Enclosing characters in double quotes preserves the literal value of all characters within the quotes, with the exception of @samp{$}, @samp{`}, and @samp{\}. The characters @samp{$} and @samp{`} retain their special meaning within double quotes. The backslash retains its special meaning only when followed by one of the following characters: @samp{$}, @samp{`}, @samp{"}, @samp{\}, or @strong{}. A double quote may be quoted within double quotes by preceding it with a backslash @enddots{} The special parameters * and @@ have special meaning when in double quotes @dots{} @end quotation @noindent Therefore, if the set of delimiters is formed by @samp{ }, @samp{\t}, @samp{\n}, @samp{\} and @samp{"}, and you decide to enclose them in double quotes, the @command{numdiff} command line should be @example numdiff -s'' \t\n\\\\\"'' @var{file1} @var{file2} @end example @noindent and not @example numdiff -s'' \t\n\\\"'' @var{file1} @var{file2} @end example @noindent In the latter case the shell would indeed replace the string @samp{ \t\n\\\"} @noindent by @samp{ \t\n\"} @noindent and then @command{numdiff} would take @samp{ }, @samp{\t}, @samp{\n} and @samp{"} as field delimiters. @command{numdiff} requires the presence of the @strong{newline} in the set of characters passed to @option{-s}. The absence of the @strong{newline} in the set of delimiters causes the issue of a warning message and the termination of the program. If you run Numdiff with the option @option{-B} (@option{--binary}) on files created under MSDog/MSWindoze, then you should put the @strong{carriage return} in the set of field delimiters. Otherwise, this character would be included in all the fields which stay at the end of a line and this would cause some undesirable effects. For instance, a number put at the end of a line would not be regarded as a numerical field by @command{numdiff}, since @command{numdiff} would consider the final @strong{carriage return} as part of the field, and this one would be then qualified as non-numerical. You can specify different delimiters for the two files to compare by putting the prefix @samp{1:} or @samp{2:} in front of the set of characters passed to @option{-s}. If the argument of @option{-s} begins with @samp{1:}, the characters after this prefix are used as field delimiters only for the file passed as first on the command line. Analogously, if the prefix is @samp{2:}, then the characters after it are used as field delimiters only for the file specified as second on the command line. You can also provide an explicit set of delimiters for just one of the files to compare, in which case @command{numdiff} uses the default field delimiters @strong{blank}, @strong{tab} and @strong{newline} for the other file. Therefore, with @samp{numdiff -s '1:: \n' @var{file1} @var{file2}} the program will take @strong{colon}, @strong{blank} and @strong{newline} as delimiters for @var{file1}, and @strong{blank}, @strong{tab} and @strong{newline} as delimiters for @var{file2}. The recommendations about quoting the set of delimiters are valid also in presence of a prefix. Starting from version 5.8 @command{numdiff} allows to specify whole strings as field delimiters instead of single characters. To this purpose the option @option{-D} is provided. Assume that file @file{register1} and file @file{register2} contain @verbatim --A: +1.0--- --B: -2.0--- --C: +3.0--- --D: -4.0--- --E: +5.0--- --F: -6.0--- @end verbatim @noindent and @verbatim --a: +1.1--- --b: -2.2--- --c: +3.3--- --d: -4.4--- --e: +5.5--- --f: -6.6--- @end verbatim @noindent respectively. Assume in addition, you would like that the dashes at the begin and at the end of every line are treated as delimiters and then neglected during the line by line comparison. To obtain this you cannot just specify the character @verb{|-|} (minus) as delimiter via the option @option{-s}: if you do it, the negative numbers appearing in the two files will be treated as positive, since the minus sign will be regarded as a delimiter. By means of the option @option{-D} you can tell @command{numdiff} to consider the strings @verb{|--|} and @verb{|---|} as field delimiters, but not the single character @verb{|-|}. To see this in practice, look at the output of the command @samp{numdiff -D ': -- --- \s \n' register1 register2}: @example ---------------- ##1 #:1 <== A ##1 #:1 ==> a @ @@ ##1 #:2 <== +1.0 ##1 #:2 ==> +1.1 @ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##2 #:1 <== B ##2 #:1 ==> b @ @@ ##2 #:2 <== -2.0 ##2 #:2 ==> -2.2 @ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##3 #:1 <== C ##3 #:1 ==> c @ @@ ##3 #:2 <== +3.0 ##3 #:2 ==> +3.3 @ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##4 #:1 <== D ##4 #:1 ==> d @ @@ ##4 #:2 <== -4.0 ##4 #:2 ==> -4.4 @ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##5 #:1 <== E ##5 #:1 ==> e @ @@ ##5 #:2 <== +5.0 ##5 #:2 ==> +5.5 @ Absolute error = 5.0000000000e-1, Relative error = 1.0000000000e-1 ---------------- ##6 #:1 <== F ##6 #:1 ==> f @ @@ ##6 #:2 <== -6.0 ##6 #:2 ==> -6.6 @ Absolute error = 6.0000000000e-1, Relative error = 1.0000000000e-1 +++ File "register1" differs from file "register2" @end example @noindent The argument @samp{-D ': -- --- \s \n'} instructs @command{numdiff} to regard every occurrence of a colon (@verb{|:|}), of a blank (@verb{|\s|}), of a newline (@verb{|\n|}), as well as every occurrence of the strings @verb{|--|} and @verb{|---|} as field delimiters. The minus sign in front of the negative numbers is then properly handled. In general the argument to the option @option{-D} is a blank separated sequence of one or more strings each of which contains no blank. Thus, the general form of the argument to the option @option{-D} is @example @var{string1} @var{string2} ... @var{stringN} @end example @noindent where @var{string1}, @var{string2}, and so on are sequences of one or more characters (strings) containing no blank. Mind that at least one of these strings must be @samp{\n}. In addition, if a string contains the newline character, this must be the only one: strings like @samp{#\n}, @samp{%%\n}, or @samp{\s\n} are not allowed (entering such a string makes the program terminate after issuing a warning message). Since the blank character has a special meaning for the shell, if the argument of @option{-D} is formed by two or more strings it should be quoted either with a single (@samp{'}) or with a double quote (@samp{"}). Quoting is also adviced if one of the strings passed to @option{-D} contains a character (or a sequence of characters) having a special meaning for the shell. For the usage of single and double quoting to delimit the argument of @option{-D} the same warnings and recommendations apply as for the argument of @option{-s}. If you want to set as delimiter a string which contains one or more blanks, then you have to make use of the escape sequence @option{\s}, like in the example above: within the argument of @option{-D} the blank character is always interpreted as a separator of adjacent delimiters. More generally, when writing the argument of @option{-D} the same escape sequences are allowed as for the argument of @option{-s}. This turns out to be particularly useful whenever a multibyte character is used as delimiter in (one of) the files to compare. As example consider the comparison between @file{ledger1}: @example In Out Jan 1200.00@euro{} 1000.00@euro{} Feb 800.40@euro{} 650.00@euro{} Mar 1620.50@euro{} 1500.00@euro{} Apr 760.00@euro{} 900.00@euro{} Total 4380.90@euro{} 4050.00@euro{} Difference: +330.90@euro{} @end example @noindent and @file{ledger2}: @example In Out Jan 1100.00@euro{} 1000.00@euro{} Feb 800.40@euro{} 750.00@euro{} Mar 1620.50@euro{} 1700.00@euro{} Apr 750.00@euro{} 900.00@euro{} Total 4270.90@euro{} 4350.00@euro{} Difference: -79.10@euro{} @end example Since the Euro symbol is attached to all values, @command{numdiff} cannot compare them in the proper way if it is run with the default field delimiters, as the output of the command @samp{numdiff ledger1 ledger2} shows: @example ---------------- ##3 #:2 <== 1200.00@euro{} ##3 #:2 ==> 1100.00@euro{} @ @@ ---------------- ##4 #:3 <== 650.00@euro{} ##4 #:3 ==> 750.00@euro{} @ @@ ---------------- ##5 #:3 <== 1500.00@euro{} ##5 #:3 ==> 1700.00@euro{} @ @@ ---------------- ##6 #:2 <== 760.00@euro{} ##6 #:2 ==> 750.00@euro{} @ @@ ---------------- ##8 #:2 <== 4380.90@euro{} ##8 #:2 ==> 4270.90@euro{} @ @@ ##8 #:3 <== 4050.00@euro{} ##8 #:3 ==> 4350.00@euro{} @ @@ ---------------- ##10 #:2 <== +330.90@euro{} ##10 #:2 ==> -79.10@euro{} @ @@ +++ File "ledger1" differs from file "ledger2" @end example @noindent The trick to perform the comparison in the proper way consists in specifying the @euro{} symbol as field delimiter, in addition to blank, horizontal tabulation and newline. If @file{ledger1} and @file{ledger2} are encoded in UTF-8, this can be done by using the option @option{-D} with the argument @samp{\xE2\x82\xAC \s \t \n}, since the hexadecimal representation of @euro{} in UTF8 is given by the byte sequence 0xE2 0x82 0xAC. On my PC the output of the command @samp{numdiff -D '\xE2\x82\xAC \s \t \n' ledger1 ledger2} shows that with such a choice of the delimiters @command{numdiff} performs indeed a numerical comparison of the values contained in the two files: @example ---------------- ##3 #:2 <== 1200.00 ##3 #:2 ==> 1100.00 @ Absolute error = 1.0000000000e+2, Relative error = 9.0909090909e-2 ---------------- ##4 #:3 <== 650.00 ##4 #:3 ==> 750.00 @ Absolute error = 1.0000000000e+2, Relative error = 1.5384615385e-1 ---------------- ##5 #:3 <== 1500.00 ##5 #:3 ==> 1700.00 @ Absolute error = 2.0000000000e+2, Relative error = 1.3333333333e-1 ---------------- ##6 #:2 <== 760.00 ##6 #:2 ==> 750.00 @ Absolute error = 1.0000000000e+1, Relative error = 1.3333333333e-2 ---------------- ##8 #:2 <== 4380.90 ##8 #:2 ==> 4270.90 @ Absolute error = 1.1000000000e+2, Relative error = 2.5755695521e-2 ##8 #:3 <== 4050.00 ##8 #:3 ==> 4350.00 @ Absolute error = 3.0000000000e+2, Relative error = 7.4074074074e-2 ---------------- ##10 #:2 <== +330.90 ##10 #:2 ==> -79.10 @ Absolute error = 4.1000000000e+2, Relative error = 5.1833122630e+0 +++ File "ledger1" differs from file "ledger2" @end example If @file{ledger1} and @file{ledger2} had been saved using a multi-byte encoding different from UTF-8, then the sequence of bytes which corresponds to @euro{} in this other encoding should have been passed to @option{-D}. As for @option{-s}, with @option{-D} you can specify different delimiters for the two files to compare by means of the prefixes @samp{1:} and @samp{2:}, like in @samp{numdiff -D '1:\t \n' -D '2: -- \s \n' first_file second_file}. The recommendations about quoting the set of delimiters are valid also in presence of a prefix. Mind that, if you provide an explicit set of delimiters for just one of the files to compare, @command{numdiff} uses the default field delimiters @strong{blank}, @strong{tab} and @strong{newline} for the other file. If you run Numdiff with the option @option{-B} (@option{--binary}) on files created under MSDog/MSWindoze, you should always include the character @samp{\r} in the set of field delimiters. The option @option{-s} and @option{-D} can appear more than once on the command line. In case of conflicts, @command{numdiff} assumes as set of delimiters for a given file the one specified last on the command line. By means of the option @option{-#} the user can set the number of digits in the significands used in multiple precision arithmetic. The default value is 35, the largest admissible value is 180. If @command{numdiff} has been linked against the GNU Multiple Precision Arithmetic Library (also called GNU MP), then the precision it uses is typically higher than the specified one. On my machine the actual value of the precision is 20 if the user requests a value between 0 and 20, 30 if the user specifies a precision between 21 and 30, 40 for a user-specified value between 31 and 40, and so on. Anyway, the actual precision is never less than the one requested by the user. @noindent Take into account that an higher precision makes the execution of @command{numdiff} slower. This is particularly true if @command{numdiff} is not using the computational routines from the GNU MP library and the files to compare contain a lot of numerical fields. In addition, mind that @command{numdiff} truncates the value of a numerical field if it has @i{too much} digits with respect to the current precision. To be precise, denoted by @var{P} the current value of the precision, the following rules apply. @itemize @item If @command{numdiff} has been built with its own internal support for multiple precision arithmetic, then @itemize @item if a number is written in ordinary decimal notation, @command{numdiff} will consider, in addition to all digits of the integer part, only the first @var{P} digits of the fractional part; @item if a value is written in scientific notation, then @command{numdiff} will only consider the first @var{P} digits of the fractional part of the mantissa. @end itemize @item If @command{numdiff} uses the routines from the GNU MP library to perform its computations, the value of a numerical field is first translated into scientific notation and then only the first @var{P} digits of the fractional part of the mantissa are considered. @end itemize @noindent You can find out whether your local version of @command{numdiff} is relying on GNU MP or not by executing the command @samp{numdiff -v}. If @command{numdiff} uses GNU MP, then this command will display the following message or similar (possibly translated into your mother language) among other information: @example The software has been linked against the GNU Multiple Precision Arithmetic Library, version number 4.2.4. @end example @noindent If @command{numdiff} does not rely on GNU MP, then the displayed message will be (up to translation into your mother language) @example The software has been built with its own internal support for multiple precision arithmetic. @end example @noindent By means of the option @option{-c} the user can qualify a string as a symbol or name for a currency. The string passed as argument to this option is ignored whenever it appears immediately before the first digit of a number. In particular, the presence of this string does not prevent a field from being considered of numeric type. By prefixing the argument of @option{-c} with @samp{1:} or @samp{2:} it is possible to set the currency name/symbol only for one of the compared files, or to specify different currency names for the two files. As example we consider the files @file{money1}: @verbatim Profits Expenses +$430.10 -$300.50 +$750.20 -$550.02 +$876.24 -$720.00 Totals $2056.54 -$1570.52 @end verbatim @noindent and @file{money2}: @verbatim Profits Expenses USD430.10 -USD300.50 USD750.20 -USD550.02 USD876.24 -USD720.15 Totals 2056.54 -1570.67 @end verbatim To properly compare them, we have to tell @command{numdiff} that @samp{$} and @samp{USD} are the currency symbols for @file{money1} and @file{money2}, respectively. This can be achieved by @samp{-c 1:$} and @samp{-c 2:USD}. The output of the command @samp{numdiff -c 1:$ -c 2:USD money1 money2} is @example ---------------- ##5 #:2 <== -$720.00 ##5 #:2 ==> -USD720.15 @ Absolute error = 1.5000000000e-1, Relative error = 2.0833333333e-4 ---------------- ##7 #:3 <== -$1570.52 ##7 #:3 ==> -1570.67 @ Absolute error = 1.5000000000e-1, Relative error = 9.5509767466e-5 +++ File "money1" differs from file "money2" @end example @noindent as it is reasonable to expect. The argument of @option{-c} may also be a multi-byte string, in particular a multi-byte string encoded in UTF-8. If your locale uses UTF-8 as encoding, you can write the argument directly in this form. For instance, you can write @samp{-c @euro{}} to specify as currency name the Euro symbol. If your locale does not use UTF-8 as encoding, or UTF-8 is not supported by your terminal, you may still write an UTF-8 encoded string as a multi-byte string by specifying each single byte of every (multi-byte) character. To this purpose you can use the same octal and hexadecimal escape sequences recognized by the options @option{-s} and @option{-D}, but then the argument of @option{-c} has to be quoted to avoid the interpretation of the hexadecimal escape sequences by the shell. For example, if the files to compare are encoded in UTF-8, you can set @euro{} as currency name by adding @samp{-c '\xE2\x82\xAC'} to the command line of @command{numdiff}, since the hexadecimal representation of @euro{} in UTF-8 is given by the sequence of bytes 0xE2 0x82 0xAC. To see this in practice, if @file{euro1} contains the text @example Profits Expenses +@euro{}430.10 -@euro{}300.50 +@euro{}750.20 -@euro{}550.02 +@euro{}876.24 -@euro{}720.00 @end example @noindent and @file{euro2} the text @example Profits Expenses +@euro{}430.10 -@euro{}300.00 +@euro{}750.20 -@euro{}550.02 +@euro{}876.00 -@euro{}720.00 @end example @noindent then the report of @samp{numdiff -c '\xE2\x82\xAC' euro1 euro2} is @example ---------------- ##3 #:2 <== -@euro{}300.50 ##3 #:2 ==> -@euro{}300.00 @ Absolute error = 5.0000000000e-1, Relative error = 1.6666666667e-3 ---------------- ##5 #:1 <== +@euro{}876.24 ##5 #:1 ==> +@euro{}876.00 @ Absolute error = 2.4000000000e-1, Relative error = 2.7397260274e-4 +++ File "euro1" differs from file "euro2" @end example Please consider that @option{-c} is only provided to let @command{numdiff} regard a field as numeric also in presence of a currency name immediately before its first digit: @command{numdiff} does not know anything about currencies and can not perform any kind of conversion between them. In addition, mind that the number after the currency name can be written in any format, not only in financial notation. @command{numdiff} can even cope with the currency name when it appears in a complex number. For example, with @samp{-c EUR} @command{numdiff} considers @verb{|+EUR12-EUR0.24i|} and @verb{|+12-0.24i|} as equal. The options @option{-d}, @option{-t}, @option{-g}, @option{-p}, @option{-n}, @option{-e} and @option{-i} can be used to instruct @command{numdiff} about the numeric formats used in the files which it is going to compare. Since the two files to compare do not have to adopt the same numeric format, @command{numdiff} allows to specify different numeric formats for them. Each of the options @option{-d}, @option{-t}, @option{-g}, @option{-p}, @option{-n}, @option{-e}, and @option{-i} can have as argument one or two (single-byte) characters, in particular one or two digits if the option is @option{-g}. In the first case the argument refers to both files to compare, in the second case the first character is for the file specified first on the command line, the second character for the file specified last. For instance, the option @option{-d} can be used to tell @command{numdiff} which character(s) is(are) used to indicate the decimal point in the two files to compare. If you give the command @samp{numdiff -d_ @var{file1} @var{file2}}, then @command{numdiff} will understand that both in @var{file1} and in @var{file2} the character @strong{underscore} (@samp{_}) is used in place of the default one (@samp{.}) to indicate the position of the decimal point in the numerical values. But if the command is @samp{numdiff -d_: @var{file1} @var{file2}}, then @command{numdiff} will understand that the decimal point is indicated by the character @strong{underscore} in @var{file1}, and by @strong{colon} (@samp{:}) in @var{file2}. If you omit to use one of the options @option{-d}, @option{-t}, @option{-g}, @option{-p}, @option{-n}, @option{-e}, and @option{-i}, then the corresponding attribute will take its default value, @pxref{Default Numeric Format}. You should be careful whenever you use one or more of these options. First, not all characters can be passed to them as arguments. The arguments of the option @option{-g} must be digits, the arguments of the options @option{-d} and @option{-t} must be punctuation marks (punctuation marks are all the characters of the ASCII set for which the standard C function @code{ispunct} returns a non zero value), those ones of the options @option{-p}, @option{-n}, @option{-e} and @option{-i} must be graphical characters but digits (graphical characters are all the characters of the ASCII set for which the standard C function @code{isgraph} returns a non zero value). It is not possible to set the decimal point, the thousands separator, the positive sign, the negative sign, the prefix for decimal exponent or the symbol of the imaginary unit in such a way that, for a same file, two or more of these characters come out to be equal. This rule also applies if you miss/omit to explicitly select a symbol through the appropriate option. For instance, the command @samp{numdiff -d,. @var{file1} @var{file2}} will make @command{numdiff} abnormally terminate after printing the error message: @example The numeric format specified for the first file is illegal, the following symbols should be all different while two or more of them are actually equal: Decimal point = `,' Thousands separator = `,' Leading positive sign = `+' Leading negative sign = `-' Prefix for decimal exponent = `e' Symbol used to denote the imaginary unit = `i' @end example @noindent With the option @option{-d} we have told @command{numdiff} that in the first file the decimal point is indicated by the character @strong{comma}, but at the same time we have not modified the character in use to separate the groups of thousands, which has remained the default one, i.e. @strong{comma}, for both files to compare. In this way we have implicitly told that in @var{file1} the character @strong{comma} represents both decimal point and thousands separator. Since this is not reasonable, @command{numdiff} refuses to work. To avoid this problem it would be sufficient to set explicitly the thousands separator by means of the option @option{-t}: @samp{numdiff -d,. -t., @var{file1} @var{file2}}. Of course, we assume here that the decimal point and the thousands separator are represented in @var{file1} by @strong{comma} and @strong{dot} respectively, in @var{file2} by @strong{dot} and @strong{comma}. I strongly suggest you, whenever you write a file, to avoid using the same symbol for two different things (like would be using @strong{comma} for both decimal point and thousands separator), it is nonsense. At last, it is possible (but silly) to specify as argument for the options @option{-d}, @option{-t}, @option{-g}, @option{-p}, @option{-n}, @option{-e}, or @option{-i} one of the characters used as delimiters in the files to compare. @command{numdiff} does not complain, but you have to consider that the program first uses the set of field delimiters to split the files into fields and only afterwards, when it has to distinguish between numerical and non-numerical fields, it takes into account the numeric formats specified for the two files. To prevent conflicts, you should then avoid to specify as argument for the options @option{-d}, @option{-t}, @option{-g}, @option{-p}, @option{-n}, @option{-e}, or @option{-i} a character which is also used as field delimiter. As a general rule, in writing a file you should avoid using the same symbol to mean two different things. What we have said also explains why the argument of the option @option{-c} should never contain field delimiters. @anchor{Restriction of the comparison to particular fields} The option @option{-X} can be used to restrict the comparison between files to a certain group of fields. @anchor{Use of the option -X} This option requires as argument a range of positive integer values or eventually just one positive integer number. The argument indicates the position(s) of the fields that @command{numdiff} has to ignore. Remember that the fields of a line are numerated starting from the left hand of the line and proceeding towards the right hand. The argument passed to @option{-X} can start with a prefix, which must be either @samp{1:} or @samp{2:}. @samp{1:} refers to the file passed as first on the command line, @samp{2:} to the file specified as second. With the prefix @samp{1:} only the fields of the first file corresponding to the specified position(s) are ignored. Similarly, you have to use the prefix @samp{2:} if you want to ignore only fields from the second file. The option @option{-X} can appear more times on the command line, in which case @command{numdiff} will ignore all fields located in the positions so specified. Some examples can clarify the use of ranges and prefixes. If the file @file{List1} contains the data @verbatim * a 1 1 1 1 * b 2 2 2 2 * c 3 3 3 3 * d 4 4 4 4 * e 5 5 5 5 @end verbatim @noindent and @file{List2} the data @verbatim 1 1.1 1.01 A 1.001 1.0001 2 2.2 2.02 B 2.002 2.0002 3 3.3 3.03 C 3.003 3.0003 4 4.4 4.04 D 4.004 4.0004 5 5.5 5.05 E 5.005 5.0005 @end verbatim @noindent then the output of @samp{numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2} is @example ---------------- ##1 #:4 <== 1 ##1 #:2 ==> 1.1 @@ Absolute error = 1.0000000000e-1, Relative error = 1.0000000000e-1 ##1 #:5 <== 1 ##1 #:3 ==> 1.01 @@ Absolute error = 1.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##2 #:4 <== 2 ##2 #:2 ==> 2.2 @@ Absolute error = 2.0000000000e-1, Relative error = 1.0000000000e-1 ##2 #:5 <== 2 ##2 #:3 ==> 2.02 @@ Absolute error = 2.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##3 #:4 <== 3 ##3 #:2 ==> 3.3 @@ Absolute error = 3.0000000000e-1, Relative error = 1.0000000000e-1 ##3 #:5 <== 3 ##3 #:3 ==> 3.03 @@ Absolute error = 3.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##4 #:4 <== 4 ##4 #:2 ==> 4.4 @@ Absolute error = 4.0000000000e-1, Relative error = 1.0000000000e-1 ##4 #:5 <== 4 ##4 #:3 ==> 4.04 @@ Absolute error = 4.0000000000e-2, Relative error = 1.0000000000e-2 ---------------- ##5 #:4 <== 5 ##5 #:2 ==> 5.5 @@ Absolute error = 5.0000000000e-1, Relative error = 1.0000000000e-1 ##5 #:5 <== 5 ##5 #:3 ==> 5.05 @@ Absolute error = 5.0000000000e-2, Relative error = 1.0000000000e-2 +++ File "List1" differs from file "List2" @end example @noindent Numdiff cuts off from @file{List1} the fields in the positions 1, 2 and 6 and from @file{List2} the fields in the positions 4, 5 and 6. In this way it compares the third, fourth and fifth field of every line of @file{List1} with the first, second and third field respectively of the corresponding line of @file{List2}. An equivalent form of the command @samp{numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2} is given by @samp{numdiff -X 1:1-2 -X 2:4-5 -X 6 List1 List2} : since the sixth field is cut off from both files, we can refer to it without a prefix. As you can see, you can specify a range of fields by using the notation @samp{@var{m}-@var{n}}, where @var{m} and @var{n} are the field numbers of the first and of the last field in the range. It is even possible to use range expressions like @samp{@var{m}-} or @samp{-@var{n}}. The first expression corresponds to all fields starting from the @var{m}th one (inclusive) till to the end of line, the second selects all fields from the first one till to the @var{n}th one (inclusive). Therefore the command @samp{numdiff -X 1:1-2 -X 2:4 -X 1:6 -X 2:5-6 List1 List2} is equivalent to @samp{numdiff -X 1:-2 -X 2:4 -X 1:6 -X 2:5- List1 List2} and to @samp{numdiff -X 1:-2 -X 1:6 -X 2:4- List1 List2}. Mind that, while writing a specification for the option @option{-X}, the largest field number you can use is 32768. If you employ the option @option{-X} the exit status of @command{numdiff} reflects the outcome of the restricted comparison. For instance, the exit status of @samp{numdiff -X 8- @var{file1} @var{file2}} is 1 only if @command{numdiff} has found a difference in the first seven fields of @var{file1} and @var{file2}. If the two files differ only in the fields after the seventh one, then @command{numdiff} ends with a zero exit status. Going back to the example with @file{List1} and @file{List2}, the output of @samp{numdiff -X 1:1-2 -X 1:4- -X 2:2- List1 List2} is @example +++ Files "List1" and "List2" are equal @end example @noindent since every field of @file{List1} at position 3 is equal to the first field in the corresponding line of @file{List2}. The exit code returned by the program to the shell is in this case zero. The options @option{-z}, @option{-Z}, @option{-m}, @option{-H}, @option{-f}, and @option{-T} influence the action of the filter and their use is then described later, @ref{Filtering}. Care that @option{-z} and @option{-Z} need both an argument in the same form required by @option{-X}. Since version 5 Numdiff accepts also long options to conform to the GNU standards. For example, now it is possible to use @samp{--separators='\n\t %'} or @samp{--separators '\n\t %'} instead of using @samp{-s '\n\t %'}. The long options, which start all with two dashes, are listed at the beginning of this chapter, each one near to the corresponding short option. The argument of a long option may or may not be preceded by the @verb{|=|} sign. The only exceptions are the options @option{--test-filter} and @option{--overview}, for which the presence of the @verb{|=|} before the argument is mandatory. Thus, @samp{--test-filter=60} is correct while @samp{--test-filter 60} is not accepted. @node ndselect, Invoking ndselect, Invoking numdiff, Top @chapter Selecting lines and fields for the comparison @cindex ndselect (introduction to its use) @cindex Tools Together with the version 5.x of Numdiff is shipped the program @command{ndselect}. Originally, I decided to create this utility in order to deal with a situation that comes out often in Numerical Analysis. Here I present a very simple example of such a situation. Let us suppose that file @file{list1} contains the values of the square root, rounded to the 20th decimal digit, for all integer numbers between 12 and 24: @verbatim 12 3.46410161513775458705 13 3.60555127546398929312 14 3.74165738677394138558 15 3.87298334620741688518 16 4 17 4.12310562561766054982 18 4.24264068711928514641 19 4.35889894354067355224 20 4.47213595499957939282 21 4.58257569495584000659 22 4.69041575982342955457 23 4.7958315233127195416 24 4.89897948556635619639 @end verbatim @noindent File @var{list2} contains @emph{suitable} approximations of the square root only for the numbers between 12 and 21 which are multiple of 3: @verbatim 12 3.46410162002945508100 15 3.87298387096774193548 18 4.24264705882352941176 21 4.58260869565217391304 @end verbatim @noindent These approximations could have been obtained by using the famous Heron's algorithm: given an approximation @code{a} for the square root of a number @code{x}, a better approximation is computed by using the formula @code{a := 0.5 * (x/a + a)}. What we want now is to understand by means of @command{numdiff} how good the approximations contained in file @var{list2} are. Unfortunately, we cannot execute directly the command @samp{numdiff list1 list2}, since in this way we would compare the approximations provided for the square roots of 15, 18, and 21 with the square roots of 13, 14, and 15, respectively. To make the comparison in the right way, one could open @file{list1} in a text editor and remove from this file all lines but the ones related to the numbers 12, 15, 18, and 21. This approach is practicable since we have to remove only a few lines: one can easily figure out how boring and inefficient would be to manually remove hundreds or thousands of lines from a file. An expert GNU user would suggest that it is possible to automate this removal by using the well known utilities @command{head} and @command{sed}, in this particular case @samp{head -n 10 list1 | sed -n -e '1~3 p' > List1}. A quick explanation for the ones who do not know how to use @command{head} and @command{sed}: the previous command extracts from @file{list1} the first 10 lines, namely the lines containing the square roots of the numbers from 12 to 21, then picks every third line starting from the first one to select only the lines related to 12, 15, 18, and 21. Finally, these lines are printed to the file @file{List1}, which then looks like: @verbatim 12 3.46410161513775458705 15 3.87298334620741688518 18 4.24264068711928514641 21 4.58257569495584000659 @end verbatim Once obtained @file{List1}, we can perform the comparison between the values we are interested in by means of @samp{numdiff List1 list2} . Unfortunately, this trick only works if you have installed the GNU version of @command{sed} which, as far as I know, is the only one providing the extension @var{first~step} to specify line addresses. This is why I decided to implement @command{ndselect}, which allows to obtain the same result as above with the simpler command @samp{ndselect -b 1 -e 10 -s 3 list1 > List1}. The meaning of the arguments passed to the options @option{-b}, @option{-e}, and @option{-s} is the following: we tell @command{ndselect} to print every third line of file @file{list1} (the option @option{-s} specifies the step) starting from the first one (the option @option{-b} specifies the beginning) and ending within the tenth one possibly inclusive (the option @option{-e} specifies the end). Because of the presence of the redirection operator @code{>}, the previous command sends to the file @file{List1} what @command{ndselect} would print to the screen (standard output). Since version 5.6 @command{ndselect} can also be used to select particular fields of a file. Instead of printing all fields of every line, you may want to print indeed only the fields at particular positions. To do this you can employ the option @option{-F} to indicate the position of the first field to print, the option @option{-L} to indicate the position of the last field that can be printed, the option @option{-I} to set the increment when selecting the fields. In addition, the option @option{-S} can be used to specify a set of field delimiters different from the default one (which consists of @strong{blank}, @strong{tab} and @strong{newline}). As for @command{numdiff}, the field delimiters are used to split the input lines into fields. The option @option{-S} of @command{ndselect} recognizes and accepts the same escape sequences of @command{numdiff} options @option{-s}, @option{-D}, and @option{-c}. As example consider the selection of the even fields between the second and the sixth one inclusive from the file @file{many_many_columns}, whose contents are shown here: @verbatim A | I | 1.1 | 1.08 | 1.01 | 0.1 | 11.011 | -1.0e-1 B | II | 2.2 | 2.16 | 4.04 | 0.4 | 24.024 | -1.0e-2 C | III | 3.3 | 3.24 | 9.09 | 0.9 | 39.039 | -1.0e-3 D | IV | 4.4 | 4.32 | 16.16 | 1.6 | 416.039 | -1.0e-4 E | V | 5.5 | 5.40 | 25.25 | 2.5 | 525.416 | -1.0e-5 F | # | # | # | # | # | # | # @end verbatim @noindent This selection can be accomplished by means of the command @samp{ndselect -S '| \t\n' -F 2 -L 6 -I 2 many_many_columns}, whose output shows only the selected fields: @example I | 1.08 | 0.1 II | 2.16 | 0.4 III | 3.24 | 0.9 IV | 4.32 | 1.6 V | 5.40 | 2.5 # | # | # @end example @noindent Of course, you can also select particular fields of particular lines, as shown by the output of the command @samp{ndselect -S '| \t\n' -b 1 -e 5 -s 3 -F 2 -L 6 -I 2 many_many_columns}: @example I | 1.08 | 0.1 IV | 4.32 | 1.6 @end example By default, @command{ndselect} reuses the delimiters found in the input lines while writing the selected fields to the standard output. You can specify a custom separator by means of the option @option{-O}. This one recognizes and accepts the same escape sequences of @command{numdiff} options @option{-s}, @option{-D}, and @option{-c}. For example, @samp{ndselect -S '| \t\n' -b 1 -e 5 -s 3 -F 2 -L 6 -I 2 -O '\t\t' many_many_columns} puts two horizontal tabulations after every printed field: @verbatim I 1.08 0.1 IV 4.32 1.6 @end verbatim Even if the implementation of a filter in @command{numdiff} and the addition of the option @option{-X} have made @command{ndselect} much less useful than in the past, this tool can still be used to handle some special cases. In addition, it can be used as a filter for other programs than @command{numdiff}. The complete synopsis of @command{ndselect} can be found in the next chapter. @node Invoking ndselect, Filtering, ndselect, Top @chapter Invoking ndselect @cindex Invoking ndselect @cindex Options, command line (ndselect) @cindex Command line options for ndselect @cindex Synopsis (ndselect) @cindex Diagnostics (ndselect) @noindent @strong{SYNOPSIS} @example ndselect -h|--help|-v|--version @end example or @example ndselect [-b @var{N}][-e @var{N}][-s @var{N}][-F @var{N}][-L @var{N}][-I @var{N}][-S @var{IFS}][-D @var{DELIMS}] [-O @var{OSEP}][-x][-l @var{PATH}][-o @var{PATH}][@var{FILE}] @end example @noindent where @var{FILE} is the name of the file to read from. In the first case @command{ndselect} prints a short help or/and version number, Copyright, License notice, and NO-Warranty disclaimer. In the second case @command{ndselect} prints to the standard output a subset of lines and fields from @var{FILE}. The complete path of @var{FILE} should be given, a directory name is not accepted. If no input file is specified, the program reads from the standard input. @noindent @strong{OPTIONS} @table @option @item -b, --beginning, --start=@var{N} Set to @var{N} the number of the first line to print (The default behavior is to start with line number 1) @item -e, --end=@var{N} Set to @var{N} the number of the last line that can be printed (The default behavior is to arrive till to the end of the file) @item -s, --step=@var{N} Set to @var{N} the increment to use when selecting the lines to print (The default value for the increment is 1) @item -F, --first-field=@var{N} Set to @var{N} the number of the first field to print (The default behavior is to start with field number 1) @item -L, --last-field=@var{N} Set to @var{N} the number of the last field that can be printed (The default behavior is to arrive till to the end of every line) @item -I, --increment=@var{N} Set to @var{N} the increment to use when selecting the fields to print (The default value for the increment is 1) @item -S, --separators=@var{IFS} Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline) @item -D, --delimiters=@var{DELIMS} Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline) @item -O, --output-separator=@var{OSEP} Specify the string to use as separator while writing the selected fields to the standard output (The default behavior consists in reusing the delimiters found in the input lines) @item -x, --omit-empty-lines Do not print empty lines @item -l, --warnings-to=@var{PATH} Redirect warning and error messages from stderr to the indicated file @item -o, --output=@var{PATH} Redirect output from stdout to the indicated file @item -h, --help Show this help message @item -v, --version Show version number, Copyright, Distribution Terms and NO-Warranty @end table @noindent Passing 0 as argument to the option @option{-L} or to @option{-e} is equivalent to omit this option and leave enabled the default behavior (which consists in scanning till to the end of the line and of the file, respectively). @noindent @strong{DIAGNOSTICS} The exit status is 0 in case of normal termination, -1 (255) in case of error. @noindent As @command{numdiff} does, since version 5 also @command{ndselect} accepts long options. Thus, instead of @samp{ndselect -b 1 -e 10 -s 3 list1 > List1} you can write @samp{ndselect --start=1 --end=10 --step=3 list1 > List1}. The usage of the option @option{-D} is the same as for @command{numdiff}. The option @option{-S} corresponds to the option @option{-s} of @command{numdiff}. @node Filtering, Warnings, Invoking ndselect, Top @chapter Using the filter of numdiff @cindex Filter Since version 5 you can activate a filter when launching @command{numdiff} to make the program appropriately compare the given files even if they do not have the same structure. Recalling the example of chapter 6, if you run the command @command{numdiff -z 2- -V list1 list2} you obtain the following result: @example ---------------- ##1 <== 12 3.46410161513775458705 ##1 ==> 12 3.46410162002945508100 ##1 #:2 <== 3.46410161513775458705 ##1 #:2 ==> 3.46410162002945508100 @ Absolute error = 4.8917004940e-9, Relative error = 1.4121122985e-9 ---------------- ##2 <== 13 3.60555127546398929312 ==> ---------------- ##3 <== 14 3.74165738677394138558 ==> ---------------- ##4 <== 15 3.87298334620741688518 ##2 ==> 15 3.87298387096774193548 ##4 #:2 <== 3.87298334620741688518 ##2 #:2 ==> 3.87298387096774193548 @ Absolute error = 5.2476032505e-7, Relative error = 1.3549253331e-7 ---------------- ##5 <== 16 4 ==> ---------------- ##6 <== 17 4.12310562561766054982 ==> ---------------- ##7 <== 18 4.24264068711928514641 ##3 ==> 18 4.24264705882352941176 ##7 #:2 <== 4.24264068711928514641 ##3 #:2 ==> 4.24264705882352941176 @ Absolute error = 6.3717042443e-6, Relative error = 1.5018250929e-6 ---------------- ##8 <== 19 4.35889894354067355224 ==> ---------------- ##9 <== 20 4.47213595499957939282 ==> ---------------- ##10 <== 21 4.58257569495584000659 ##4 ==> 21 4.58260869565217391304 ##10 #:2 <== 4.58257569495584000659 ##4 #:2 ==> 4.58260869565217391304 @ Absolute error = 3.3000696334e-5, Relative error = 7.2013423303e-6 ---------------- ##11 <== 22 4.69041575982342955457 ==> ---------------- ##12 <== 23 4.7958315233127195416 ==> ---------------- ##13 <== 24 4.89897948556635619639 ==> +++ File "list1" differs from file "list2" @end example Numdiff has recognized that the lines of @file{list1} with the square roots for the numbers 13, 14, 16, 17, 19, 20, 22, 23, and 24 have been deleted from @file{list2}. The numerical comparison has been done by coupling each line of @file{list2} with the line of @file{list1} which displays the square root for the same integer value. The output obtained running the filter of Numdiff via @command{numdiff -f -z 2- list1 list2} confirms this: @example 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 < 14 3.74165738677394138558 < 15 3.87298334620741688518 15 3.87298387096774193548 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 18 4.24264705882352941176 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 21 4.58260869565217391304 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" @end example If you compare the command @command{numdiff -z 2- -V list1 list2} with the one used for the files @file{bill1} and @file{bill2}, @pxref{command}, you surely notice that the filter has been invoked in different ways, first with @option{-z @@} and then with @option{-z 2-}. The @i{synchronization} procedure used by the filter is based on @i{blurring} and byte-by-byte comparison. The options @option{-z} and @option{-Z} are used to select which fields from which file have to be blurred. They take both an argument in the same form requested by @option{-X}, @pxref{Use of the option -X}, but accept additionally the special value @samp{@@} as abbreviation for the range of fields @samp{1-}. Thus, the specifications @samp{1:@@}, @samp{2:@@} and @samp{@@} are used to mean all fields of the first file, of the second one or of both, respectively. Employing @option{-z} and @option{-Z} in the right way is extremely important to let the filter work as desired. For instance, @command{numdiff -f -z @@ list1 list2} matches the lines of @file{list1} and @file{list2} in the same wrong way @example 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 15 3.87298387096774193548 14 3.74165738677394138558 18 4.24264705882352941176 15 3.87298334620741688518 21 4.58260869565217391304 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 < 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 < 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" @end example @noindent as Numdiff would do without employing the filter. It is essential then to understand what @i{blurring a field} means and how the filter uses blurring to match the lines of the files to compare. After reading the files the filter removes from each of them (from their images in the memory, actually) all the fields selected by the option @option{-X}, then it replaces each of the fields that have to be blurred by a special character. This special character is the same for both files and it is so chosen that it cannot appear in the text. Blurring a field means to replace it by this sort of @i{place card}. After doing this, the filter converts all remaining numerical fields to a standard format and then compares the files byte by byte neglecting the field delimiters. This comparison is just used to establish which lines of the first file are not present in the second, which lines of the second file are missing in the first one, and how to match the remaining lines to create a one-to-one correspondence. Only at this point @command{numdiff} inspects each couple of corresponding lines, splits the two lines into the constituent fields, and neglecting those ones eventually specified through the option @option{-X} compares corresponding fields as it is supposed to do, performing a numerical comparison whenever the fields are both legal numerical values. Blurring the right fields is essential to appropriately match the lines from the two files before doing any numerical comparison. Without blurring, the numerical fields could prevent the filter of @command{numdiff} from an appropriate matching of the lines by creating confusion with their (maybe small) numeric differences. Blurring can be of two types, conditional or unconditional. The blurring is conditional if it has to be performed only for fields which turn out to be legal numerical values. The arguments of the option @option{-z} indicate which fields of which file have to be blurred @strong{under the condition that they are recognized as numeric fields}. Non-numeric fields are left by @option{-z} untouched (no blurring occurs for them). Then @samp{-z 1:5-7} makes the filter blur the 5th, 6th and 7th field of each line of the first file whenever they are recognized as numeric. By means of the option @option{-Z} you can specify which fields have to be unconditionally blurred, i.e. independently of their type, numeric or not. For example, @samp{-Z 2:3-4} activates the blurring of the 3th and 4th field of each line of the second file. Going back to the comparison of the files @file{list1} and @file{list2}, the option @samp{-z 2-} of the command @samp{numdiff -z 2- -V list1 list2} makes the filter transform the (memory copies of the) two files as @example 12 @bullet{} 13 @bullet{} 14 @bullet{} 15 @bullet{} 16 @bullet{} 17 @bullet{} 18 @bullet{} 19 @bullet{} 20 @bullet{} 21 @bullet{} 22 @bullet{} 23 @bullet{} 24 @bullet{} @end example @noindent and @example 12 @bullet{} 15 @bullet{} 18 @bullet{} 21 @bullet{} @end example @noindent respectively. Here @bullet{} denotes the special symbol used by the filter in the blurring procedure, even if this symbol is not actually a bullet. Since in this example space, tab and newline are used as field delimiters, the byte-by-byte comparison between the transformed files produces the same result displayed by the command @samp{sdiff -W} when applied to them: @example 12 @bullet{} 12 @bullet{} 13 @bullet{} < 14 @bullet{} < 15 @bullet{} 15 @bullet{} 16 @bullet{} < 17 @bullet{} < 18 @bullet{} 18 @bullet{} 19 @bullet{} < 20 @bullet{} < 21 @bullet{} 21 @bullet{} 22 @bullet{} < 23 @bullet{} < 24 @bullet{} < @end example @noindent If you put the blurred fields back you obtain exactly the output of @samp{numdiff -f -z 2- list1 list2}, i.e. the outcome of the filtering: @example 12 3.46410161513775458705 12 3.46410162002945508100 13 3.60555127546398929312 < 14 3.74165738677394138558 < 15 3.87298334620741688518 15 3.87298387096774193548 16 4 < 17 4.12310562561766054982 < 18 4.24264068711928514641 18 4.24264705882352941176 19 4.35889894354067355224 < 20 4.47213595499957939282 < 21 4.58257569495584000659 21 4.58260869565217391304 22 4.69041575982342955457 < 23 4.7958315233127195416 < 24 4.89897948556635619639 < +++ File "list1" differs from file "list2" @end example @noindent Since the second field is a numerical value in all lines of @file{list1} and @file{list2}, using the option @option{-Z} instead of @option{-z} makes no difference in this case. The output of @samp{numdiff -f -Z 2- list1 list2} is then the same of @samp{numdiff -f -z 2- list1 list2}. After this explanation you should also understand why @samp{numdiff -f -z @@ list1 list2} gives a wrong result. Since also the first field is always a numerical value, the option @samp{-z @@} makes the filter transform the two given files as @example @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @end example @noindent and @example @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @bullet{} @end example @noindent respectively, making then impossible to match the lines in a reasonable way. We consider now a typical situation in which it is better to use @option{-Z} in place of @option{-z}. If file @file{Table1} contains @verbatim -6 2.449490 -5 2.236068 -4 2.000000 -3 1.732051 -2 1.414214 -1 1.000000 0 0 - - - - - - - - - 1 1.000000 2 1.414214 3 1.732051 4 2.000000 - - - - - - - - - 5 2.236068 6 2.449490 7 2.645751 - - - - - - - - - 8 2.828427 9 3.000000 10 3.162278 11 3.316625 12 3.464102 - - - - - - - - - - - - - - - - - - 13 3.605551 14 3.741657 @end verbatim @noindent and @file{Table2} contains @verbatim -6 Not_defined -4 Not_defined -2 Not_defined 0 0.000000 2 1.414216 4 2.000000 6 2.449494 8 2.828469 10 3.162278 12 3.464102 14 3.741658 ********************END @end verbatim @noindent then the output of @samp{numdiff -z 1:2 -Z 2:2 -f Table1 Table2} is @example -6 2.449490 -6 Not_defined -5 2.236068 < -4 2.000000 -4 Not_defined -3 1.732051 < -2 1.414214 -2 Not_defined -1 1.000000 < 0 0 0 0.000000 - - - - - - - - - < 1 1.000000 < 2 1.414214 2 1.414216 3 1.732051 < 4 2.000000 4 2.000000 - - - - - - - - - < 5 2.236068 < 6 2.449490 6 2.449494 7 2.645751 < - - - - - - - - - < 8 2.828427 8 2.828469 9 3.000000 < 10 3.162278 10 3.162278 11 3.316625 < 12 3.464102 12 3.464102 - - - - - - - - - < - - - - - - - - - < 13 3.605551 < 14 3.741657 14 3.741658 > ********************END +++ File "Table1" differs from file "Table2" @end example @noindent which is exactly what is expected. On the other hand the command @samp{numdiff -z 2 -f Table1 Table2} displays @example -6 2.449490 | -6 Not_defined -5 2.236068 | -4 Not_defined -4 2.000000 | -2 Not_defined -3 1.732051 < -2 1.414214 < -1 1.000000 < 0 0 0 0.000000 - - - - - - - - - < 1 1.000000 < 2 1.414214 2 1.414216 3 1.732051 < 4 2.000000 4 2.000000 - - - - - - - - - < 5 2.236068 < 6 2.449490 6 2.449494 7 2.645751 < - - - - - - - - - < 8 2.828427 8 2.828469 9 3.000000 < 10 3.162278 10 3.162278 11 3.316625 < 12 3.464102 12 3.464102 - - - - - - - - - < - - - - - - - - - < 13 3.605551 < 14 3.741657 14 3.741658 > ********************END +++ File "Table1" differs from file "Table2" @end example @noindent which is partially wrong. Notice that in @file{Table1} you find (truncated to the sixth decimal digit) the square roots of the absolute values of the integer numbers between -6 and 20, plus some randomly added lines. The file @file{Table2} contains approximations (obtained by Newton's method) of the square roots of the even numbers between -6 and 20. Since the (real) square root is not defined for negative numbers, the values corresponding to -6, -4 and -2 are replaced by @verb{|Not_defined|}. Since @verb{|Not_defined|} is not a numeric value, during the execution of the last command the filter transforms @file{Table1} in this way @example -6 @bullet{} -5 @bullet{} -4 @bullet{} -3 @bullet{} -2 @bullet{} -1 @bullet{} 0 @bullet{} - - - - - - - - - 1 @bullet{} 2 @bullet{} 3 @bullet{} 4 @bullet{} - - - - - - - - - 5 @bullet{} 6 @bullet{} 7 @bullet{} - - - - - - - - - 8 @bullet{} 9 @bullet{} 10 @bullet{} 11 @bullet{} 12 @bullet{} - - - - - - - - - - - - - - - - - - 13 @bullet{} 14 @bullet{} @end example @noindent and @file{Table2} in this other way @example -6 Not_defined -4 Not_defined -2 Not_defined 0 @bullet{} 2 @bullet{} 4 @bullet{} 6 @bullet{} 8 @bullet{} 10 @bullet{} 12 @bullet{} 14 @bullet{} ********************END @end example @noindent Unfortunately the first three lines are enough to confuse the synchronization procedure of the filter, which is based on a byte-by-byte comparison with exclusion of the field delimiters, as explained before. You can check that this is definitely the case by looking at the output of the command @samp{sdiff -W} on the transformed files, which is @example -6 @bullet{} | -6 Not_defined -5 @bullet{} | -4 Not_defined -4 @bullet{} | -2 Not_defined -3 @bullet{} < -2 @bullet{} < -1 @bullet{} < 0 @bullet{} 0 @bullet{} - - - - - - - - - < 1 @bullet{} < 2 @bullet{} 2 @bullet{} 3 @bullet{} < 4 @bullet{} 4 @bullet{} - - - - - - - - - < 5 @bullet{} < 6 @bullet{} 6 @bullet{} 7 @bullet{} < - - - - - - - - - < 8 @bullet{} 8 @bullet{} 9 @bullet{} < 10 @bullet{} 10 @bullet{} 11 @bullet{} < 12 @bullet{} 12 @bullet{} - - - - - - - - - < - - - - - - - - - < 13 @bullet{} < 14 @bullet{} 14 @bullet{} > ********************END @end example If we give the command @samp{numdiff -z 1:2 -Z 2:2 -f Table1 Table2} instead of @samp{numdiff -z 2 -f Table1 Table2}, the second field of the lines of @file{Table2} is always blurred. The filter transforms then @file{Table2} into @example -6 @bullet{} -4 @bullet{} -2 @bullet{} 0 @bullet{} 2 @bullet{} 4 @bullet{} 6 @bullet{} 8 @bullet{} 10 @bullet{} 12 @bullet{} 14 @bullet{} ********************END @end example @noindent and @i{re-synchronizes} the files @file{Table1} and @file{Table2} in the right way. Using the unconditional blurring is suggested in all cases when a certain field, which you want to include in the comparison (use @option{-X} to completely neglect one or more fields), is of numeric type in almost all lines of (one of) the given files. This can be for instance the case when in some lines the contents of the field are given by a special numeric value, like @verb{|Infinity|}, @verb{|Inf|}, @verb{|+Inf|} or @verb{|-Inf|}, or by @verb{|NaN|}, abbreviation for @i{Not a Number}. Concerning the numeric fields which are not blurred, it is worth remarking that the filter is not confused by differences in the numeric format. Before the byte-by-byte comparison, numeric values are converted indeed to a standard format. To offer an example of this, let us suppose that @file{short1} contains a list of numbers with their logarithms @verbatim 0.001 -3 0.01 -2 0.1 -1 1 0 1000 3 1000000 6 1000000000 9 @end verbatim @noindent and @file{short2} the same list of numbers and logarithms, but with differences in the numeric format: @verbatim ****************** 0.0010000 -3 .0100 -2 0000.10 -1 1. 0 1,000.000 3 1,000,000. 6 1,000,000,000 9 @end verbatim @noindent Then @samp{numdiff -f -z 2- short1 short2} displays @example > ****************** 0.001 -3 0.0010000 -3 0.01 -2 .0100 -2 0.1 -1 0000.10 -1 1 0 1. 0 1000 3 1,000.000 3 1000000 6 1,000,000. 6 1000000000 9 1,000,000,000 9 +++ File "short1" differs from file "short2" @end example @noindent showing that the filter has matched the lines in the right way. The filter can even handle the case when the same numerical value is written in decimal notation in one file and in scientific notation in the other one. If the files @file{decimal} and @file{scientific} contain @verbatim .001 -3 .01 -2 .1 -1 * * * * * * * * * 1 0 1000 3 1000000 6 1000000000 9 @end verbatim @noindent and @verbatim ***************** 1.0e-3 -3 1.0e-2 -2 1.0e-1 -1 1.0e0 0 1.0e3 3 1.0e6 6 1.0e9 9 ***************** @end verbatim @noindent respectively, then @samp{numdiff -f -z 2- decimal scientific} prints @example > ***************** .001 -3 1.0e-3 -3 .01 -2 1.0e-2 -2 .1 -1 1.0e-1 -1 * * * * * * * * * < 1 0 1.0e0 0 1000 3 1.0e3 3 1000000 6 1.0e6 6 1000000000 9 1.0e9 9 > ***************** +++ File "decimal" differs from file "scientific" @end example @noindent proving that the filter does not get confused. No problems arise also in the case when for the same field the scientific notation is used in both files. If the files @file{sc1} and @file{sc2} contain @verbatim 1.E-3 -3 1.00E-2 -2 1.0E-1 -1 1.0000E0 0 001.0E3 3 +01.000E6 6 1.0E+09 9 1.0E+10 10 * * * * * * * * * * @end verbatim @noindent and @verbatim ***************** 1.0e-003 -3 1.0e-2 -2 1.0e-1 -1 1.0e0 0 +1.0e3 3 1.0e+6 6 1.0e9 9 @end verbatim @noindent respectively, then @samp{numdiff -f -z 2- sc1 sc2} correctly displays @example > ***************** 1.E-3 -3 1.0e-003 -3 1.00E-2 -2 1.0e-2 -2 1.0E-1 -1 1.0e-1 -1 1.0000E0 0 1.0e0 0 001.0E3 3 +1.0e3 3 +01.000E6 6 1.0e+6 6 1.0E+09 9 1.0e9 9 1.0E+10 10 < * * * * * * * * * * < +++ File "sc1" differs from file "sc2" @end example @noindent The filter can even handle an improper use of the scientific notation, meaning for example that it can recognize @samp{123.456E+2} and @samp{1.23456E+4} as equal. We can see this in the case of the files @file{Scnot1}: @verbatim ------------------------- 1.2E0 * 1 2.45E-1 * 2 -3.678E-2 * 3 @end verbatim @noindent and @file{Scnot2}: @verbatim 12E-1 * 1 245E-3 * 2 -0.003678E+1 * 3 @end verbatim @noindent @samp{numdiff -f -z 3- Scnot1 Scnot2} displays the report: @example ------------------------- < 1.2E0 * 1 12E-1 * 1 2.45E-1 * 2 245E-3 * 2 -3.678E-2 * 3 -0.003678E+1 * 3 +++ File "Scnot1" differs from file "Scnot2" @end example @noindent which is exactly what you would expect in such a case. Also pretty hard cases do not confuse the filter. If @file{Scnot1} is given by @verbatim 1.2000e0 * 1 02.4500e-1 * 2 -003.678E-2 * 3 @end verbatim @noindent and @file{Scnot2} is the same file as before, the output of the command @samp{numdiff -f -z 3- Scnot1 Scnot2} is still right: @example 1.2000e0 * 1 12E-1 * 1 02.4500e-1 * 2 245E-3 * 2 -003.678E-2 * 3 -0.003678E+1 * 3 +++ Files "Scnot1" and "Scnot2" have the same structure @end example In all examples above the option @option{-f} is used with no argument. @anchor{Use of the option -f} However, @option{-f} accepts an optional argument, which can be used to control how @option{-f} displays its output. If you provide an argument, care not to leave any space between the option and the argument: @samp{-f60} is correct while @samp{-f 60} makes Numdiff terminate after printing an error message. If the argument is a positive number @var{NUM}, then the side-by-side output produced by @option{-f} will be @var{NUM} columns wide. The default value for the width of the output is 130, which can fit onto a traditional printer line, and is the one used when @option{-f} has no argument, or the supplied argument is zero. In other words, @samp{-f} and @samp{-f0} are just easier to remind versions of @samp{-f130}. A negative argument has the same effect as the positive argument with the same absolute value, but it causes in addition the removal of common lines from the output. For example, the command @samp{numdiff -z 1:2 -Z 2:2 -f-130 Table1 Table2} displays the following text @example -5 2.236068 < -3 1.732051 < -1 1.000000 < - - - - - - - - - < 1 1.000000 < 3 1.732051 < - - - - - - - - - < 5 2.236068 < 7 2.645751 < - - - - - - - - - < 9 3.000000 < 11 3.316625 < - - - - - - - - - < - - - - - - - - - < 13 3.605551 < > ********************END +++ File "Table1" differs from file "Table2" @end example In conjunction with the option @option{-f} or @option{-O} you can use @option{-T} to expand tabs to spaces in the produced output. This is useful to preserve the alignment of tabs in the input files, if it is thrown off by the presence of the gutter. The options @option{-H} and @option{-m} affect the performance of the filter of Numdiff. But performance has more than one dimension and these options improve one aspect of performance at the cost of another, or they improve performance in some cases while hurting it in others. The re-synchronization of the two compared files made by the filter always comes up with a near-minimal set of deletions/insertions of lines, that usually is good enough for practical purposes. If the filter displays a large set of line deletions/insertions, you might want it to use a modified algorithm that sometimes produces a smaller set of differences. The @option{-m} option does this; however, it can also cause the filter to run more slowly than usual, so it is not the default behavior. If the files you are comparing are large and have small groups of changes scattered throughout them, you can use the @option{-H} option to make a different modification to the algorithm employed by the filter. If the input files have a constant small density of changes, where change means here deletion/insertion of lines, this option speeds up the comparison without changing the output or in the worst case introducing minor modifications. @node Warnings, Index, Filtering, Top @chapter Warnings @cindex Warnings @cindex Notes @cindex Caveats @itemize @item Bug reports have to be sent to the address @email{ivprimi(at)libero(dot)it} . Please, put Numdiff in the subject and indicate the version of the operating system you are running (in particular, do not forget to specify if it is a 32- or a 64-bit system), and, if you know it, the version of the compiler used to build Numdiff. Please write also whether your version of Numdiff uses the GNU MP library or not. Before writing an email be sure to run the latest stable version of Numdiff, I do not provide support for older versions. @item Numdiff does not accept numbers in scientific notation whose exponents lie outside the range -1073741824, @dots{}, +1073741824. If such a number is found in any of the files to compare, the execution of the program is stopped after printing a suitable error message on stderr. Under the assumption that the numeric format in use is the default one, with "1.0001e-2147483640" the displayed error messages is @example numdiff: A number with a too small exponent has been found, namely "1.0001e-2147483640". Exponents smaller than -1073741824 are not accepted, the execution of the program ends now @end example @item @anchor{with GNU MP is better} If Numdiff has been built with its own internal support for multiple precision arithmetic instead of being linked against the GNU MP Library, then performance degradation and memory exhaustion can already make impossible to handle exponents of magnitude @math{10^6 = 1000000}. This is what I obtained on my laptop, equipped with a dual core processor @@1.50 GHz and with 1GB of RAM, when I tried to compare the numbers 1.101e1000000000 and 1.0e1000000000: @example numdiff: Insufficient memory for new allocation, the execution of the program ends now @end example In addition, you can overload the processor with numbers whose exponents lie outside the range -1000000, @dots{}, 1000000. But at least on my machine, everything works fine and quick enough as long as exponent and size of the mantissa of the numbers are in the range -1000, @dots{}, 1000. Be careful and remember that Numdiff is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Consider also that, if you have numeric data with exponents outside the range -300, @dots{}, 300, probably there is something wrong with your data: either you are using the wrong scale, or you should replace very small numbers, like 1e-100, by zero, or it is quite likely that the machine/program/algorithm which produced these data is not working right. @item If Numdiff has been linked against the GNU Multiple Precision Arithmetic Library (also called GNU MP), then the precision it uses is typically higher than the specified one. On my machine the actual value of the precision is 20 if the user gives a value between 0 and 20, 30 if the user specifies a precision between 21 and 30, 40 for a user-specified value between 31 and 40, and so on. Anyway, the actual precision is never less than the one required by the user. @item After reading a numeric field, Numdiff truncates its value if this number has @i{too much} digits with respect to the current precision. To be precise, denoted by @var{P} the current value of the precision, the following rules apply. If @command{numdiff} has been built with its own internal support for multiple precision arithmetic, then @itemize @item if the number is written in ordinary decimal notation, @command{numdiff} will consider, in addition to all digits of the integer part, only the first @var{P} digits of the fractional part; @item if the value is written in scientific notation, then @command{numdiff} will only consider the first @var{P} digits of the fractional part of the mantissa. @end itemize If @command{numdiff} uses the GNU MP library to perform its computations, the value of a numeric field is first translated into scientific notation and then only the first @var{P} digits of the fractional part of the mantissa are considered. By current value of the precision I mean the integer value specified by the option @option{-#}, or the default one (35) when this option is not in use. @item You can find out whether your local version of @command{numdiff} is relying on GNU MP or not by executing the command @samp{numdiff -v}. If @command{numdiff} uses GNU MP, then this command will display the following message or similar (possibly translated into your mother language) among other information: @example The software has been linked against the GNU Multiple Precision Arithmetic Library, version number 4.2.4. @end example @noindent If @command{numdiff} does not rely on GNU MP, then the displayed message will be (up to translation into your mother language) @example The software has been built with its own internal support for multiple precision arithmetic. @end example @item Numdiff can only be used on text files: the program terminates after printing a suitable error message if one of the files to compare turns out to be a binary file. To detect if a file is binary or not, @command{numdiff} checks for the presence of null bytes (0x00) in the file. @item If you are not including the so called white-space characters (usually @samp{ }, @samp{\t}, @samp{\f}, @samp{\v} and @samp{\r}) in the set of field delimiters, then a real and an imaginary number which are separated just by white-spaces can be coupled together and considered as a whole complex number. For example, if you are using only @strong{colon} (@samp{:}) and @strong{newline} as field delimiters and Numdiff finds a line like that @verbatim ::::3.0-5.6e-356i::::-12.9 +4.34i::::-12.9 4.34i::::New York:::: @end verbatim @noindent then it will consider this line as formed by four fields, the first two are numeric and given by the complex numbers @i{3.0-5.6e-356i} and @i{-12.9+4.34i}, the last two ones are the strings @verb{|New York|} and @verb{|-12.9 4.34i|}. I still do not know if I will modify this in the next version of Numdiff, so that the program recognizes only @verb{|3.0-5.6e-356i|} as numeric field and treats @verb{|-12.9 +4.34i|} as non-numeric due to the presence of spaces in the middle. @verb{|-12.9 4.34i|} is already considered as non-numeric due to the absence of a leading sign in the imaginary value. @item We have seen that one of the two files passed to @command{numdiff} can be @verb{|-|}, which refers to stdin (standard input). In this way one of the two files to compare can be the output produced by another command, like in @samp{cat file2 | numdiff -a 1.0e-3 file1 -}. However, if you activate the filter by means of the options @option{-z} or/and @option{-Z}, Numdiff can not work with the standard input unless you use also the option @option{-f}. Therefore, the command @samp{cat file2 | numdiff -a 1.0e-3 -z @@ file1 -} displays only the error message @verbatim numdiff: -: Illegal seek @end verbatim (or maybe the translation of this message in the language you are using on your computer) but @samp{cat file2 | numdiff -a 1.0e-3 -z @@ -f file1 -} works as expected. @item This manual describes the version 5.9 of Numdiff. Prior 5.x versions did not recognize all the options that are currently accepted, versions 4.0.0 and 3.x used even a different format for the output. @end itemize @node GNU Free Documentation License, , , Top @appendix GNU Free Documentation License @cindex GNU Free Documentation License @cindex GNU FDL @cindex FDL @include fdl.texi @node Index, , Warnings, Top @unnumbered Index @printindex cp @bye numdiff-5.9.0/docs/numdiff.10000644000175000017500000002341313054341114015142 0ustar paologpaolog.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.46.4. .TH NUMDIFF "1" "January 2017" "numdiff 5.9.0" "User Commands" .SH NAME numdiff \- compare similar files with numeric fields .SH DESCRIPTION Usage: numdiff \fB\-h\fR|\-\-help|\-v|\-\-version or .PP numdiff [\-s IFS][\-D DELIMS][\-a THRVAL[:RANGE|:RANGE1:RANGE2]][\-r THRVAL[:RANGE|:RANGE1:RANGE2]][\-2][\-F NUM][\-# NUM][\-P][\-N][\-I][\-c CURRNAME][\-d C1C2][\-t C1C2][\-g N1N2][\-p C1C2][\-n C1C2][\-e C1C2][\-i C1C2][\-X 1:RANGE][\-X 2:RANGE][\-E][\-U][\-b][\-V][\-O[NUM]][\-\-raw][\-q][\-S][\-z 1:RANGE][\-z 2:RANGE][\-Z 1:RANGE][\-Z 2:RANGE][\-m][\-H][\-f[NUM]][\-T][\-B][\-l PATH][\-o PATH] FILE1 FILE2 .PP Compare putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. .PP RANGE, RANGE1 and RANGE2 stay for a positive integer value or for a range of integer values, like 1\-, 3\-5 or \fB\-7\fR. The two arguments after the options are the names of the files to compare. The complete paths of the files should be given, a directory name is not accepted. The given paths cannot refer to the same file but one of them can be "\-", which refers to stdin. .PP Exit status: 1 if files differ, 0 if they are equal, \fB\-1\fR (255) in case of error .PP \fB\-s\fR, \fB\-\-separators\fR=\fI\,IFS\/\fR .IP Specify the set of characters to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline). If IFS is prefixed with 1: or 2:, use the given delimiter set only for the lines from the first or the second file respectively .PP \fB\-D\fR, \fB\-\-delimiters\fR=\fI\,DELIMS\/\fR .IP Specify the set of strings to use as delimiters while splitting the input lines into fields (The default set of delimiters is space, tab and newline). If DELIMS is prefixed with 1: or 2:, use the given delimiter set only for the lines from the first or the second file respectively .PP \fB\-a\fR, \fB\-\-absolute\-tolerance\fR=\fI\,THRVAL[\/\fR:RANGE|:RANGE1:RANGE2] .IP Set to THRVAL the maximum absolute difference permitted before two numeric fields are regarded as different (The default value is zero). If a RANGE is given, use the specified threshold only when comparing fields whose positions lie in RANGE. If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2 .PP \fB\-r\fR, \fB\-\-relative\-tolerance\fR=\fI\,THRVAL[\/\fR:RANGE|:RANGE1:RANGE2] .IP Set to THRVAL the maximum relative difference permitted before two numeric fields are regarded as different (The default value is zero). If a RANGE is given, use the specified threshold only when comparing fields whose positions lie in RANGE. If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2 .PP \fB\-2\fR, \fB\-\-strict\fR .IP Consider two numerical values as equal only if both absolute and relative difference do not exceed the respective tolerance threshold .PP \fB\-F\fR, \fB\-\-formula\fR=\fI\,NUM\/\fR .IP Use the formula indicated by NUM to compute the relative errors. If 'NUM' is 0 use the classic formula. If 'NUM' is 1 compute the relative errors by considering the values in FILE1 as sample values. If 'NUM' is 2 compute the relative errors by considering the values in FILE2 as sample values. .PP \-#, \fB\-\-digits\fR=\fI\,NUM\/\fR .IP Set to NUM the number of digits in the significands used in multiple precision arithmetic .PP \fB\-P\fR, \fB\-\-positive\-differences\fR .IP Ignore all differences due to numeric fields of the second file that are less than the corresponding numeric fields in the first file .PP \fB\-N\fR, \fB\-\-negative\-differences\fR .IP Ignore all differences due to numeric fields of the second file that are greater than the corresponding numeric fields in the first file .PP \fB\-I\fR, \fB\-\-ignore\-case\fR .IP Ignore changes in case while doing literal comparisons .PP \fB\-c\fR, \fB\-\-currency\fR=\fI\,CURRNAME\/\fR .IP Set to CURRNAME the currency name for the two files to compare. CURRNAME must be prefixed with 1: or 2: to specify the currency name only for the first or the second file .PP \fB\-d\fR, \fB\-\-decimal\-point\fR=\fI\,C1C2\/\fR .IP Specify the characters representing the decimal point in the two files to compare .PP \fB\-t\fR, \fB\-\-thousands\-separator\fR=\fI\,C1C2\/\fR .IP Specify the characters representing the thousands separator in the two files to compare .PP \fB\-g\fR, \fB\-\-group\-length\fR=\fI\,N1N2\/\fR .IP Specify the number of digits forming each group of thousands in the two files to compare .PP \fB\-p\fR, \fB\-\-plus\-prefix\fR=\fI\,C1C2\/\fR .IP Specify the (optional) prefixes for positive values used in the two files to compare .PP \fB\-n\fR, \fB\-\-minus\-prefix\fR=\fI\,C1C2\/\fR .IP Specify the prefixes for negative values used in the two files to compare .PP \fB\-e\fR, \fB\-\-exponent\-letter\fR=\fI\,C1C2\/\fR .IP Specify the exponent letters used in the two files to compare .PP \fB\-i\fR, \fB\-\-imaginary\-unit\fR=\fI\,C1C2\/\fR .IP Specify the characters representing the imaginary unit in the two files to compare .PP \fB\-X\fR, \fB\-\-exclude\fR=\fI\,1\/\fR:RANGE .IP Select the fields of the first file that have to be ignored .PP \fB\-X\fR, \fB\-\-exclude\fR=\fI\,2\/\fR:RANGE .IP Select the fields of the second file that have to be ignored .PP \fB\-E\fR, \fB\-\-essential\fR .IP While printing the differences between the two compared files show only the numerical ones .PP \fB\-U\fR, \fB\-\-dummy\fR .IP While printing the differences between the two compared files neglect all the numerical ones (dummy mode) .PP \fB\-b\fR, \fB\-\-brief\fR .IP Suppress all messages concerning the differences discovered in the structures of the two files .PP \fB\-V\fR, \fB\-\-verbose\fR .IP For every couple of lines which differ in at least one field print an header to show how these lines appear in the two compared files .PP \fB\-O\fR, \fB\-\-overview\fR[=\fI\,NUM\/\fR] .IP Display a side by side difference listing of the two files showing which lines are present only in one file, which lines are present in both files but with one or more differing fields, and which lines are identical. If 'NUM' is zero or is not specified, output at most 130 columns per line. If 'NUM' is a positive number, output at most 'NUM' columns per line. If 'NUM' is a negative number, do not output common lines and display at most \-'NUM' columns per line. .PP \fB\-\-raw\fR .IP Display the differences between the two compared files in raw format (not very convenient for humans) .PP \fB\-q\fR, \fB\-\-quiet\fR, \fB\-\-silent\fR .IP Suppress all the standard output .PP \fB\-S\fR, \fB\-\-statistics\fR .IP Add some statistics to the standard output .PP \fB\-z\fR, \fB\-\-blur\-if\-numerical\fR=\fI\,1\/\fR:RANGE .IP Select the fields of the first file that have to be blurred during the synchronization procedure only if they turn out to be numeric .PP \fB\-z\fR, \fB\-\-blur\-if\-numerical\fR=\fI\,2\/\fR:RANGE .IP Select the fields of the second file that have to be blurred during the synchronization procedure only if they turn out to be numeric .PP \fB\-Z\fR, \fB\-\-blur\-unconditionally\fR=\fI\,1\/\fR:RANGE .IP Select the fields of the first file that have to be unconditionally blurred during the synchronization procedure .PP \fB\-Z\fR, \fB\-\-blur\-unconditionally\fR=\fI\,2\/\fR:RANGE .IP Select the fields of the second file that have to be unconditionally blurred during the synchronization procedure .PP \fB\-m\fR, \fB\-\-minimal\fR .IP During synchronization try hard to find a smaller set of changes .PP \fB\-H\fR, \fB\-\-speed\-large\-files\fR .IP During synchronization assume large files and many scattered small changes .PP \fB\-f\fR, \fB\-\-test\-filter\fR[=\fI\,NUM\/\fR] .IP Run only the filter and then show the results of its attempt to synchronize the two files. If 'NUM' is zero or is not specified, output at most 130 columns per line. If 'NUM' is a positive number, output at most 'NUM' columns per line. If 'NUM' is a negative number, do not output common lines and display at most \-'NUM' columns per line. .PP \fB\-T\fR, \fB\-\-expand\-tabs\fR .IP Expand tabs to spaces in output while displaying the results of the synchronization procedure (meaningful only together with option \fB\-O\fR or \fB\-f\fR) .PP \fB\-B\fR, \fB\-\-binary\fR .IP Treat both files as binary files (only meaningful under Doz/Windoz) .PP \fB\-l\fR, \fB\-\-warnings\-to\fR=\fI\,PATH\/\fR .IP Redirect warning and error messages from stderr to the indicated file .PP \fB\-o\fR, \fB\-\-output\fR=\fI\,PATH\/\fR .IP Redirect output from stdout to the indicated file .PP \fB\-h\fR, \fB\-\-help\fR .IP Show help message and predefined settings .PP \fB\-v\fR, \fB\-\-version\fR .IP Show version number, Copyright, Distribution Terms and NO\-Warranty .IP .SH Default numeric format (for both files to compare): .PP Currency name = "" .br Decimal point = `.' .br Thousands separator = `,' .br Number of digits in each thousands group = 3 .br Leading positive sign = `+' .br Leading negative sign = `\-' .br Prefix for decimal exponent = `e' .br Symbol used to denote the imaginary unit = `i' .SH COPYRIGHT Copyright \(co 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi .br License GPLv3+: GNU GPL version 3 or later, see . .br This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. .SH "SEE ALSO" The full documentation for .B numdiff is maintained as a Texinfo manual. If the .B info and .B numdiff programs are properly installed at your site, the command .IP .B info numdiff .PP should give you access to the complete manual. numdiff-5.9.0/docs/numdiff.pdf0000644000175000017500000140405113054341114015555 0ustar paologpaolog%PDF-1.5 %ÐÔÅØ 1 0 obj << /Length 587 /Filter /FlateDecode >> stream xÚmTM¢@½ó+z&ÎÁ±?tBL$ñ°ãd4›½*´.‰<øï·_•èÌf’W¯_wÕ«îrðãc;Šòê`GæUŠOÛV×&³£øç¾öƒ¤Ê®[vïÖæ6ïWÛ7ñÑTÙÖvb¯“uYt/N¼.³ó5·½êÿ¢¥=åS‚> stream xÚmTM¢@½ó+z&ÎÁ±?tBL0ñ°ãd4›½*´.‰<Ì¿ß~U¢Îf’W¯_u½ªîvðãc;ZäÕÁŽÌ«Ÿ¶­®MfGñÏ}í I•]/¶ìÞ­ÍmÞ¯¶o⣩²­íÄ0^'ë²è^œx]fçkn{ÕÿEK{*ʇuÄpg6;µÞ$4»¢;»µgZ8, ’ü²M[Tå›P¯RJG¤eWxm½ñ­ž÷ŽE™7·¢â žÒ"/²îÑ7»¸¦‘¼ýj;{Y—ÇÊ‹"1þt‹m×|‘£o¼irÛåI É‘c¶×º>[TÒ›ÏEnn#×ÛûþbÅø¹‘ûÒî«¶BS¬ØEVå¶­÷™möåÉz‘”s…«¹gËüŸµ)gŽÏR©ð133wÄ xAÄbêí;¬ÒaGL6K& 0+‡}&ö"?‘á°(Ò¦Òa/ ¡cì,•!£½¥‰î-fö3¤Ù*IÃx {aªùð”sIC%ÒðhSô¢¨7å£Å}­HÏ=ŤIYƒ¹(îƒêjŧ ÿZóéàü4{ÖØSOØá5˜‡áZ ä®ekxvKº·Ǭü÷…Ü@2aÂ> stream xÚmSÁnâ0½ç+¼$z Ø¨"¤€ÄaKU¢Õ^C<ÐHàDN8ð÷õÌŠV{Hôüæç=üúØS`¾Jñ m}u%ŒÒßE Y]^/`»w¦¶oâÃÕå:1L·ÙÖVÝ‹omy¾èUÿ­àTÙ ÖÃþŽv¹Êó‘DM^ug{¦…Ç‚° ÉpmUÛ7¡^¥”žX[“ÖôÚã{=1î+kܽ¨8 …@iaª²»¯è_^|Ó˜¼¿µ\¶öXq,ÆŸ>ØvîFŽ^‚ñÎp•=‰!9òÌþÚ4gÀêBË¥0pôùÞÞ‹ ˆñs#P~k@hZ+vQÖÚ¦(ÁöA,åRÄÑf€5ÿĦœq8>K¥Â_¸—žX NˆHæžÐÔ3$¤Çž˜{<Ý0Š*¢5cÕ~ÿP÷õʯÂùÝ5WÂ42^!ž0^#žrq‰xƘœE„3xÎü ñ ªz“)cÒgl1BÌîÒ°õ•?ŸXqû!òŠNA‡¨Wš»A*dý1ùÔ)iȧΰÅç“Оó â9ç’†NVf¤¡–kô¯VäaŠžUJü†ôì?%Íš5Ø»bÿTW£=ј«±®–¾Œ¿É5ëñ2éfè&p2pj³V^ócH£Mc†VYxLS7˜E=›þ1âj· ¾gÈÈ endstream endobj 6 0 obj << /Length 196 /Filter /FlateDecode >> stream xÚ…Í Â@ „ïû9¶àÆMÓtw¯‚ ‚‚²žÔCÑ*‚?XÑçwµÖƒ%—a˜I¾˜86ë[X•y¹õ1*zçra”œ£þÓmN£Ïÿ,Õñº¶…GçŸÁ^PÝÈ âÂö‰WFk„ ,’Éí¸Ù/ qªÙJ2¿Vu£Æå)eJnå¡Ó÷”³¤ª¯ûó©1}º #Õêò!ˆûÅÚŒZÒöˆê ¶júUp± î»@è=·…psI› endstream endobj 14 0 obj << /Length 1014 /Filter /FlateDecode >> stream xÚ•ÙnÛFðÝ_Áö‰Ìõ^¼Ð''mŒ´A´j_â<ÐäJZ”‡°¤ìøï;³ÃCR”îÜ×ÎÌŠ€Ã'‚LY®X®² jo¸§º]@Àï7b’Ó‰b‰Vÿ«XœÈÄËÅ'VßlnîÞ%y 8+x!‚ÍÝJ©YžVŸÃG¡4cìØÕQ¬’<¬C Ýu¦#âo.JDXnGBŸ‰r4¤—…à ߨIo륌%‘3TûÆ ©ÚÏ¢íñÞýðcôeó+D›œF˃XK¦õìfoÐ+Ò°-»Hfá±l¯Á¶³OQ,Áæ$³ï#À^ɱ'¢í†±l"–>z CÀÇc[ÛG.Ômk¡Â’È×ï\Ùò²·:ßZõí¡t³ÓÃq,GûŒ|Ó¼bN˜„PL$”Ã`[Û”PdÍÓ<éUilgzÂÀ_/©>ÚYË4õ·²c—:„ ìívÄZŸ6‚TºH„\³VÈÊBJÞ8ÓUsX½»[<¯lô:ž¥7Ý‘ç[° &•Òá6ÂûmËq@olÑI™Ð¤ò¶?ø$œÝíW» ¶qÀ™’‰UÔ!©>íX1M"&×zIh&¸×^Jrž@¦+˜­`îAŽ`±P_A±‚rÕ êÅ‚X½‰Õ›È c ¾Ž¼àÞg§¢–gmóÉAß ÷æ—Í2ôÓ9d)S¨Uá7K€Çx?!ýª8§œîŒY?>1@;#=«Ü…}>`H<áåÑØ'ãzÄëÞìx¯T+T~ï÷7Ú,ýmtç÷Ê9“@I‹)¶OØEƵvlßaëÂ4 tÂS󚚸ð¬¦.Œrú ’ÐîÃ[å89¸ëýè*šP•84Û×ÉÖ~vS÷~U0 Ó¬x2ìYãfYse=Œ6˜‰û-(è‡ðctf"ÿ|é f¼¶2Ý`n1Nþ…zÆ [05ùrtRm^ iÊÑLôgªèªy8>Åׯ¿±Ã+«_VÂ> ÖØû£‡GÅoiøÁ=‘é¡V>“Ÿ˜…/vÜ»ëé|ï޳å\go×T¨:उdÑÃ:t½×ã·þ˜R»–ÌÆ×ëëèÍdzz/Ò”ìÁù¦ô/Áߦ> stream xÚíšKsÛ6Çïþ{]ûz|äõ‘L/äWqG1¢‚ŸÌ‚÷úNWî6åûQÒr†˜|ø!óÑÓ÷õcñájÓ:Ÿ×Þ@Ø!=>b`¦ {æzXªÀlsðŒ¡¨ V+ ©¹c¿>5ûS%cñM}Ø­Ã/HÀ±‘gà ‰ïs êY‡{OFÀž˜—„iŸ8ÆJè37¦|ð×N4S4ôm5!rŒR%P£ ÚjânA³v4eðxW/*ã¢GŽrJ?çØ~áùñxðˆ£Eg¶8q %Þ Ãf‚8¾[qH KÜvªBldÂÐkM86ÿ–F'a·My“ !ÊRz™Džn¸>-XRæk¡7Ò‚ $‘^-8ÑLÑBÐw«…J¹´Ó·Zx³R…#jƂħÑ*ãÏ®ÿ/ì?EuùÄbQš/–Þ@H,.±$óŠÅ‰fŠXÎ|ß[ &µÛ¡Ü.Ž_UÇfµÝúvs KcyÙƒùбœÃsÄ1o“ùÑ¤ÚæIß~lE˜S…ÃɺÞíW‡Í±®FeL"I¾(°žô¶0;½Ž@zýÌS_zÝh&¤7ì[¥—eˆ0û”N†G™â¨Óî`rDÁã·4À|©)®ÍÑ|{!]¸·s£™B`з" $¡>Ôn3KàÛc‡]7btëöÁ#djp@µÉ¾Õ¹Ï•íöùPõBP¹ÙØ •ͨ‚¾*&™.صÛÜBõ‡~ áPZG_•/Õo¾<{lU~›ÏÙ´:´°I½;™n4h ûV´rXçöå„ëýF6—U±ù`ƸkèÆYüò··æÂ Eò¡´ãOµn°>íì{4«fe•þî×ͺ¬Žåx%ÀmFö¡€/¡ö'ÏOho ”P·gSáM¨Í”„}«„â µ⯪¢ü0Úÿœ"̲˚ì è£Úä}>Ô]ûÓ\ÒûB‰Ê=¢ÿRc¼ endstream endobj 119 0 obj << /Length 868 /Filter /FlateDecode >> stream xÚUßo›0~ï_Á£#ca{ʪvËÔ¥UB5UÛhp‚%˜Eýïwç3iš¶Ò)Ø÷ó»»Ï¶ðø / ½d*ùT&ÞzwXi»õh±üz!œ†þ‰å—ìb|Çžx¤ÂË6§¡²ÂûÅ®Ê|oT;ò¥”L|ùQ³«f? §ìY×[P„2˜ýɾ_\gÇ\qó8’ÿ l°~ƒ.t E è p‡èÄÈ'Òâ‘!áç5žNy:§E¿+ôï@HÀìwyÕ5XbÊ­6FÕ¤ª±ÊëdŠÆ‚ uG6›V)ZuÍÆ ÃÿòVa³â„=ã¶éÉf×äÞªBw¦ÕO½qîÚ&¯‹qÓ’l¨À»Ð›g—Õ¢¯  ÔŠÅ ÉE,¨8Sb¸4f0´]GËfãDåH0§þºxp U«6¯hsß?UzMë[½VuçÌs*b{4èJUøÉÒ`ˆîloFSɨ+à±²]IŽ]9ÚDДºÈnêË÷*Q":âýŪíÀ–’>¶2øRn  /º%©±!™‡ Üì1ÿ0U ÍÇLÏ´©rs`Š­Œ@Æ-fñ4Šø„ ™¾áW8™X¢„“„àtyA2]“Å‹˜ìS*’#lÅ}ˆAW«¢OðIÈ>a}§6}u‰¢”A’þœgßî2 0[<ÒâçHÁfËål‘=~¶ÕøÇrNæp€94½å]ÄM¢¦µz·¯´%ÜnÒmn(9"‚ùë%J¯¾Aj$ËìËüvž=’’¸™g‹ëÕŠ„7h·$ÍŒd÷Öu‰ÿÙüêÁD·³% ðþay·ºæ´[)ÇGéÎH^Îz çÖ/ç¬60€]»¦uA er]uSãÁâ]N"ÖA[+K„˜•98° %­Z+Mg““ÛÚ]¾$Ä–â× Ò¹ÚZìb¨ý†ZPq¬yÕà=Žrœ5 MI¼Ù¾m¶m¾ã3dîNaݘKjIý={Dò4ñâ4åiHÏA÷2ü‰Ð¾ ¯%§„s÷OüéõšœÞôgI,ºÒ˜ý§ñøp8ðmÝó¦ÝŽ+*¿Ÿƒ áõ‘2|…òãGk°~ êÕósÔ¢âCêy ë¾ endstream endobj 123 0 obj << /Length 904 /Filter /FlateDecode >> stream xÚUKã6 ¾Ï¯ðÑjÕ²åWoí O`E›[ÛƒÆVbam)åM§¿¾¤(oœì(DÔ'ŠüH“Orøñ¤)’¦-Y[6I??åuç„„ß~|âQ/Ål§ùÝñéëª*á9ëòŽ'ÇÓÞÔqHþHŸGyñʲ²,Óâ›C&D•~ÛŠ6ýh,.×I çY”ýrÈŠ–WyZþ:þòôýñ³ïª¨X%ÊÿItÓþ‚mlVðJll‹šå¸C¶Å!«êù•EàWò?ÐzŒ9O€4Ë»häg¶®Ò+$),B¼ë(ÍG_^†4L*tp³iKZÀ§˜bûßôZÞL£³Fÿ£9­Ì°Î‹tZ^´¤£_Q úÊ1Üx•ÎFo‹6½"­%Ä —š7^P8C<µs> stream xÚZKä¶¾ï¯>h€E"E=r³;vÀF°@Ù8ÝêiaÕR[Rïîø×§^¤(µzw]`DßŪ¯ìô!ÿéC¡ŠRÇ¥.öçw Q‡—.üëïïRé÷Ÿ‚ž?¾÷—ŸyH“¸Jªôáý1œêýáá?ÑßNö2ÕÃã“Ö:Ò}|Ê2ýöéQ•Q=|jêÏÐ’–…‰ôãßÿãÝOïýbF™Ødú;s½o¶WÀöŠX¥&sÛSyœ` ·§ŸL®qCZ¹ Á>Ö§Jž`þ¬¨äPýùr¥S©<‹®c=ŒXÔQœêŽ©’4ëB†Oí÷vlzižzn²ãG&œzäÉgiå2üéçÙÚZV94PÕõ7Uýþ¨ Ø;0Úí¢«ÃQLlF¦Yþtõg¾nýÄsÐþàüxàTÇ©IùÀý–J`_§š =”,Yö’›"úmàö³ÅÙ_Ÿéàõjð„‹¹Ó!ÁŸ+ãd‡©>È:׉W±ÒÚ€Á0rjö¶eÒ¾¿4<ØDÏ×Ç4’!r@Yt‹ž Õv/<;ô¦MnرXCñÍ¢ œ¸Ô_ð¸8(Íâ*Ë`¤‰ó4ç‘ïO¼dVDÖÆZž¶œÑá¡™V™‚ò€ß–e¥ÿ(SLÒ|’©æík*Lže¦F¤QB*"™] —U” †]í·Sâv `ö}76ã$ 4,Oþ¸£ü~›îz—ofç-CÔƒïÊ$HЩm:GšNnDpaP;ÔmÍr•ãПw «JÁn`BßÐtD¡xæ=Nrr—L=déN&vZ½í·øT‡ëû-‡‚|(zÁ/×ÎT>DÛ>}ìX£;”<•$±‚eEØŽÇ-ÔQE\× öô2Ø3/²ées!ZÌ;“Vd5—žÝ EÔò@ R|ÇJ•€ŽÂ^ùeè¯-:Ñt:ñ÷‡$¾?$:ÙÜaµE;0}¨Ysúa™R[¾&®Ñáü3Ä‘Tùð@ÿÝL'l>\[;È — @lÜmÝë硳)…4;Vå8Xě޸°T©Xåæ›WfâBÝÞ/ :u`SUÛ1ø@¥ „–›nÞ ÷>÷WE8¥}³#ÉÂëÅá.’§ÁÉP‹¸ª–¬‘ v?Ñu^æÒ?åzà&ŒI£_útâŸÒh”E(`M¸Ú—±­?×\ƒ8³„À ,£Xê/àxƒ\§ƒa­¬ŒÖi¼^. ãâªù8¬¯iŽäB6Ë>) à‡%X"×a ÛóŒMÑrL\a\‡Ž]/37gæ8H¸uׄtBuqj`øÏv²ÒÑÏ>Y)ákÊÜÁÑ)ÜëÝ–f:‰s}K Ÿ\¿Xƒ½})Dî‰SauÏÄæ¥ëáúŠÔÜ…7„P6iÒ#wø|j&é2^ì^f\Y«‚­õ'C5˜4ÓÀ_RO‘( }Õ^ó>ÁÙ¤}ZØör²Ïlº)˜®ØWlø÷o”7ޤ¬H K…ohª¡JÒÍìæ¨1’lƒ®ze®qäÇøE*´É‰b«æ¨ÊÅò<Ñà€}Ëx3t+ÅÙôbÍ›^¬ˆéUU˜^l Ó‹d£µéåüe‡´ ÒR<`ø²±-ÄØRËI r óHòxËè¿Ó©ÎÜA¿ÛÀ¡>œ‘ÛI\ÕgägÖ\ñjÄÑõ¯ï¸Lü$²+>ä$‘¼jÎwXŸ½ ø…ö`ÝÚÅ2z95ÈûŽ]ydÔ†t‹ÎY-A¶8µø%(ÐÂ*¤·©×Q"¯ÌõÓ^*6„¿ðì¦Ç¢â²ðÀóùòhPÝ@]dÞýÀ2àŸŽÛ}Htòˆ!á¾oHéMô{ÓYU4¨Jk0Z|‹<§h06Ð'üI……KJºñOÁ¾.O¹Z†OA;ú˜ÄNð7m†+‡žj×sßMCmÛ€¶·ëýgE[Êû¿ͺ޷»]0;+Sˆl—›õ®!i}–TØ#T‰H2&WN$6xðYûr¥óåB\àÝ}ùú¸Ù¶¯((õi*[åbÙ¡0Ô/(Tæù«³Œ¤íЇF…¡ð8 Û-ëÓ¬ûâlûCH*Ͷ˜»‘aƒ~Û cHÊþê-Ü:-Fh˜È5YvOÑLçÆkÐ<‹-?3Ó¢¼U³<_ßPî8˜ßØv‡ƒy±ˆ¼˜98rÝÇM$ÚÍejÙ±FƒÙ˜j{à6örvùˆU ë¥^£¨ÖÆù†ší Rœs-ì;£®eôÃÈdËãA+®í´cZ3ÉWúÀ¾À(˽S÷³À­Aßóxm’Ú͈N×eúÍ!©\/vfnb ëùr¿µª,\·£ãŽ mà8"‹º4ñAc1‚Ú+«°O ÜsˆB?9$é ô ¸Ádß«ŠCŠ|ÃQH|ô^Â=б°ù:tR¤8NU%»•÷¹ò".;L“ J¯tÛW!“›æc¤ªò3 "Êvlò]ψ¤T% _&.Ípv§ä–Üv4þ؇bQ7ªÒÀ×e¬†Úµxe25^Ï€”ÑrkÕíâÝ,‰~í˜<^%‰E5Ëôd¹ô™qØžg ‘ŒÁæí¤GÿÌA‘.a;ãUŽÒ’ÃÀcåqb1©”à ë£@w™ª[Œ€®öÀDçbü#9+ ~±üLÅy‘;É_¬Ú¾n©Š© ¨gÝdä¥Ð¿uÆRŦ¨6IÌÞöà‡@kw`[•Á±Fn¹*çaØ< Ã\¥uÖ“p@ûñŠˆ„)8s+£,ädøWÔbÍXYÇ™šišÐ ¸I¬`øé6¦6å7DÂ+YpE*g_(¡„ÑØG‚Í4 L“¼)³•ß@Á "XómÔ1So.‰1°IÍ¡0€„½tÍŸ5W=\T(Ë–A.7l©ØZEFª‡³\1pÉÙ™r7Óº½¯Ñùì­`ñá*ÖŽÂñÙ¿ÒþVBc¨ý “8Õ[<½:-täkUÕø`Àj¯õÈâyÏïN1ˆÚv ³S(˜D)8¤š[ÈeT¥Ðü' „ÅEåâ<6{’—øÂ‰öÀ]žÉN@po@RkY‚Í¢ºMÛ#1L¶S™G¿ïC`UrÙ+HƒHa`ö‘®8¹¬œ“Š…_‘4óuç2¦Òyy=´LÇóú.‹ãÊõSÇ‘;’œ#á\Û@ ý”Û0˜Ýw“â¼(?€6ã©¿¶Bõ6+œþ! Ì2Zþb‘á6S)úUù÷§È<<à¶¶BÍ4Î’ê-þO–ûn¶ 5#ŸÑ%GüÙ™Œ)Æ¡þÔôWéÇt±B°òâ¡rª•r³¦Ý*˜g‡åé~ðå3[èrÕ_ì™2ª*ÄuCËÅ¢u›J†N®é¥aYè¸ê\p,We‘›8?ƒ‡0 `CŒ-ØðS’Q&_»DNU8_f™ï†RkØÌlê5lÒól}A˸oœk†ø¼¿…Ù9‹xiíþÞ<p<ˆ?9¡}sv"âæ»)äß!«‡{RXŒ³Èƒ£xº*)5…]E^¦î]–607ûVRt ˜…¦ÜB¼ªŠ—€ˆ <”-–‹ÆÉW³¾èr|-æÝð`(üÕéœ×¹r¢¸[$ýÕ2µ uL÷M§¡–æÍÞrÀpnÚÖ%´• ^ÎyÔ#‹óÓ21cÂpÀÒ#V9>M£Cß¶v·Ü#ieP}eÖ±ù¤½HÔø×Ic”™=j¬£FÊ£æøËVh¿N¶m\ÅîýýÎñâ'qü‚m£b0°»,ÿ^–`g2œô°JO[çi8ï¾°[ª–"wœå‰Ä¨dGSuX|‹ï`q@ãïñy#©¢ßŽÜfFzgLÔí>iÅNæ 'eÂ[éÜÀ¬¹ËwÃ…±‘­¤[(é ß3àü+wAwbóY…<}ƒûZ}ÛŠAò+¦!–ñ½f>ã.ç2ú÷S9 Ÿ'„Jäq¥—qÓfçã´T7Ï@ÏöÙù›³’_9H¹4JÙ:Œ  ‘ÂR~ÌÕÚyž”7Û~dÔû§§EpìÏõÔœ]n/À°|Æ0ìfJÊ)ágÆS”§CENei¶У§.òÌJóø|îŽ{Áåù†{ªÇ†X¤ä©O/¨L=IsB¼÷k ºêVrbË#¼ö;‘¥ÛàbéêÂñÞ_˜Ð0(0 ÍÄTâ]‰Z<2::Ù‹x*w‘·-ˆ1’9˜ŸÒù9»9 it2$®Ýy£×E“žzJwA«}ûö:}%µäÃyN•·N(¼ µåw›"ál#•ÄÍ”ÞÝ3Œ_¤Ù w_ÿ*‹y!”ˆ2qNøf»ý" 35PÓZw1xp4ÜCRmÉ„'´ ñÁIúAVê?Àîä1Šý4PKàêx±4åÚÝéQu+Øq-rtÛÿGvs뾈u¦Þæ`Øðí0§Ìßæ˜Ì,Ú”"/¦šS@Xg÷Àí¤â@ñ‘ÐHGeøJÌÒó&0ÉM46œ9àŸ¼:©†‹×«|ò¡_Ù‘†ì~ µ¶1v‰îç# Ûö^£aüÀ¶ÿ1Éþ endstream endobj 131 0 obj << /Length 2703 /Filter /FlateDecode >> stream xÚµkoܸñ{~…{ ñê$‘’¨ 9ÄÉõRÒ´¸óá>4*¯¸^"Zi+iãø~}ç¥ÇÊò(j9ç=C:< à7áÁ/ž…‚·ÄÕóÝå³ïŠã“0ð³ O.7SR—ÅÉ?½÷Û|ßÙæt¥”òÔëÓ•Ö±÷÷¯§‘ñlóÕÙX M{úô_—??ûËåpXÅ~¬Õ9ë±aÏ$~¦5p™øA¬™ÅË­m-0¦/ohzÝV ÍÛºjz³E¾oyå‚?…]»Â²­f ÛíK»³¢wBš1*”çû¦¾nòOn\·¼Î÷ù•+]79ȃ’NV¡&)V¡òÃ8d)ò=PÜ7.ïl è*½u½Û“D8ù„º´m¿Â¬å®rÕ5ÃrØÙÆ­órÜcË¢õáø,õ.*ß4®¶u['D‰pr!¨H4Wµ{×€®Pˆ@Øgî¯XJX‹%S‹…±o"è„Wn³´#ÃFÆOTÒ£Ã!é\e±÷á_¢…pÜÖÒ(3FÊ(Ÿ¢’U¦½O¶‹3ü¯>ßåùÕé }–çõ†¿d-üš—oÿ˜Ab?Øg¿UN<¿íáFyþ’Ø*1¾ ÒGåV¹‚ )ÈA´Nü(œ9Ⱥ;ä%ù†6¤ø\ƒÃ·5 W0¬ãY]ž±ÙòJ.øs8 =°hè‘Nu깎6usDüfëJ‹¾cRïnÀÝ­Â íª–tÚÒŠñÒ ú„+\÷öëÍ6a‚êæK{väf½P–ˆü`QëÊOÓÑÙ»ûÔ®•¯Âopr$¼FAÁBY±xás|Ÿ—ݶ>\o]= ý8|Ü×Uè›xðõiTÍ)êÀ7&}Š<d“èQB]ß²L'$ÜÄ88/¤e›>Ó‘ó©0ôu”Å÷¦©wU`òß³§¹>Q"œbkŠØÖ‡f-ãµxª}½¨@Hï:Ξh¿lPá–2— ·OE,Ð.y#@0õuýò(T»nònÈ[Á£„Þ‹Aj‰¢ ÌÏü±( —RºQ"ºÒ£” ­sº…%9 >ýÆ fz}6³mÈ! @X-Ý•ÏeøBŽí™8cV<À˼í4d-*…©7Káõ 5>[³wðŽÕ—AI°¼«)ÿ¢T6ï U'…*Ë«eó‚uö”œA"h+Ó¶‹yv©¦)È­A`÷œBjðœ5pºŠâÄÊN-¦Æ(N9—d(Å8Ùº¼“¼@‘ˆ­Û¹2oa¨Õ8)]eGŠä4‘”&» ZßÅ•…3Lõ‘箫ºA"¯ŒSè–ŽBµÝA•À‚O[H¼cbk ÃÑ`Lu-#ÕÍ÷Ä“^HËd¡pìònÙ@*Ð~=)‡Å¾Î³wX‡ÍÀT‡¥‚kvÀcÞÕÍ­$-ùI˜Í¢³¹>ô]\‹=EÐW ,òöy·myÈí@4®-FÍ€±ûÂU®1”¡o‚o}`«m¸qÌv ô\|ÎŽG’9… :…œÁ/<-Dª jp•‘Îúžgà\ëuÝt°wÆoΫ×èÄ)¦Iš–ó®£B&ÄxRôSÂÀ‘è‚Á¨©8ã~Á % aÕJ"º½C>Îqî¶™5:Ì;4Òoi 1Ññ"[×¥EŸnÕg{î *Ñ’b¶›Êú]Æk-tßňI-RÞïÛ¼¿6Ç­ òƒ(RÎ)ôdp2~ðtœñá 1‘¾6f¨sˆÒ B§ƒ­Æ‘OØoÐ#R¥36§\òŒ¶*BËôý/öÔ£!2Ú–ŒZðœÜsŠ=ÞZz\“ïØ}a‚ýÄYæýÎ5P«zÉ¥…еhe²Q®¬?qb0œP0OW{ƒ)3zÂónŽ˜ïd$}MÛ—UDÐ ÛfiyÁM»±0yŰè™èÒŒ‡²KãHÒ*þ•jÔ0®(si3ׯu.=¬¡Ÿ»êH2Ó[!;ÕÅ\=¡qú 5‹É‡Ù#™t-¾½Æ'+Ì'ã%A_O1•‹–º"/·IæGF?­R@/Ñ#îEYX…Z>ó[bæWb\aiÝ…Ícû„Ÿr󈘘¤Ï¤õƒ »NgÑâ󾮵¤Æ„ï/ø$Ôzn”3”ÛÐÕÜ$>ȽÏùd¡¡q6؆½o:»âÁªŸ 1º³ì¸!M¢¤¹AÄõ¼çr¹í8Ó‘žq†w¶£Ò “ÉåÁ ¸AÃO)0ËeÙþçÐSvßH%¹Üž* ÄC„pN¾äEP „mµ¶ áG)mM½jÞ@V„piši‘t‚£ýQoÁâ~JYÇhõ¡ãI+N¸Æ~I¯‡Ýœ)H¸t%ɘç,qÜx¤Ù4ÓL}/õ¬f|XµKIrB<ÞÍëfùE®ŒC¢Zý¸HnÛq<ÞÝÈ$~”<ñU#ßÚ&4)SÔÓëŽÛæ ¶„æ(|¦úDÛŽ•â(žx±²7RÁ`ò9ˆƒ/êú˜Hœ}•®×ÅKJÚ;ÿõýeÕ >fz½¶‚oÁ9œŠ+návôGÿ>ZŠù¾]•}|ˆ×(„›D¤§¼v÷òªà•5p4MŽ=ö>d½ÓËþU™W_ÆÜÒð¥ ÉIü×?:¤BTÑ(@¢t);^œ'—äŸðñ²–§}èñiHh»Íì)Aú¦%Ó‚’lˆŒÕðñKýä»·º|ñ¦ÆÆÏ¨çWØ ÓpU4Œh!J©Ÿëv{€Gqà)ˆÖÆi{¯Ô+í`C h79^Ò²SQcÙ:Ü-ãØWQ(”ר8&Ïða)I]e²æA¯ ^•Ü’àøAl&ï™+X?¯¨ßèÿ£ß4ôƒD´›1™óûµ ‚OU¢ÐW u¢†ïVæ»J ‚Ì@}÷öÞ£^‰ú«#Å& Žt ÍL_¼x±d´sb‰ÿIƒJMXAĤŽTž®$| ²ïûçn~.›®Ó›Ý€ûŽ‘–SÜþ`qž½ùŽ‚…öÞk×jQ¢ÆœÈ;o¾ñô¯‡Ðo¾^~S™mõqȬf? vzþ<;= £0†ÑŸß¼a¥!·`€¥oÞüÀÏØøÅÀ˜zûö~ÔœŸ!ÒáGÍùa'þŸ˜‰çÌpny„“xÎÉ=A3²Cê»jëò€=?ÎlÓ`îÆ¡" ù±+}ÆÐ_,V½¯÷vÅËûC2—÷ÞüI»(K¢”÷Kõ‘ºâŸ?xyÅïÆ•²ðÇw²Üò·…:Oïk1Ý(rÙM¥…ö¤øÓÒ‘Oòüh0S4v¬‹ßÝ9ø(ÝÉ?Êÿ ¿ùe endstream endobj 137 0 obj << /Length 2452 /Filter /FlateDecode >> stream xÚµÙnÜÈñÝ_¡Ø~àØ¦OF¼°³±ëØÈÃî>ôÌôhsÈÉ‘4þú­êj^£–,#ˆˆ}TW×}´øƒ_~‘Š‹4“q&Ó‹õþs«Íõ ~ýç3îá–¸œ@þýêÙ_/µ¾à,ÎYÎ/®¶STW›‹ß¢ŸwæÐÙf±”RFòíb©”Žþ}³Yd››ÂÞÂÏRéÅWŸŸ}¼.ÓBÇZÉ'RÖCß'/™’Ç‹3 2‰™VDáûŽ>¬Úº§'xŽÿìuÌØË>é$<“ì1Ù'(äõQÆ~JÎ{ùòå#<ýRTž2AŸ¢¢ï¶(ýÆó²h;þÜo·ômwuã'ÝÎøSöî`×Ýü%tåòì'ȉ|€S>ð¬òsV?ЧBwÅA‰Ì=…wùÿãýÖu USÒz¶—¡Í/”gYö·ÈȰxŽÈÏc&’’Aœ¡ÇiæIú€!²Ã¸©@ Y·fo)švÅÞzt³—%q*RàÀᩎ{¤-t¯’SÀÛ¢, ñ¡}Mo÷n벬q㶨®i vxÔuÎùzoÛÖ\ûuå‰î6àŸoCÔ.9Obgsî_½zååý±Úëí£6ÔX³ÞY{»€ºæä¨uãz€ÝL ÙTìô.²8‘ÉÌÄ.ïéÐMvÆk{_7vÄÖž[ï=zß„àmŠß‡²*Í¢?[<:¸|‹§?çOæéU2ãïá.ª‡þ7çH{cäñb‰%æ?j"§ª;øT‚6ÓbKß“ãòH“MMÚ•‚ “pìI‘D_!¢À™[šÝRX‡Ñ˜`7” b¾kA9æˆXÔ‰Nœ}G• !Dd}£J`_TÙÀ(A•¶ío'O0EEùQŒÉ*ëL]+=8{li6’—)IJ0p¢Œf`G‡Âñ“[„+Ànº]}K¸}ŒŒ«è-êÉQÅ$5¯þ»È\Q'±÷¬«RhC³Š*?š82\enKš@ÑE¾LS(æÝ‰–¦»éùvìnêñAP9U„¤©«â›ÇL±e,°pÌz¾&"Á0‚¥l¢?˜¸Ÿä@Gki‹M\1›Mį6´º±¥¬zXW–MÁ¨0ÄG7(@k]íü¢·­µsLSñÀ2Ôã=Ê®ô@Ó¶ .%Þ[`Å»ÝWZ&)9Û†=ôAüÕ°]ûŸr5Ê,e £Ì¼ó‹hç¦ñG¨rœ¡õWU3ÌàHÅfSú#m½÷£^¹P7ÁþÅ Èš QM#Ä“ƒ`äá€9zf‰†ÝÊ:S­-ÆOžP8blt7œìŒÃÎË<2†û;ÔSÄ1u•XÀ:žÜ¬ÆÐ0?Óß`ÕË”yS\)ɹÌŸÖö2ç‘S?'ò|ÃS ‡ì `"C$E_Æ0pæµ=t4Þ:ƒËzZqä …Åaôh 3D‡\hÔÝ-…¯0¸)•F­‹g”ë3…µ†J!B£d ñû pš1¿ç4Œ›ƒ!â¾®B¬"Ë+Ö¦T¡.EÈ$fB>¥Kh’€Ÿ¥KU|Gdlˆÿ¾>Õé¬n”P¶ å)úgà&È{‰ªËv˜xM]axÇ{†bSf@™ägB1¨—ŸL!X¹Hb ÉOKôùµ#§¨I<̼íÁ*%XqÁ!Å"ÃsêÂóО™ÓM4” ùÓÄ,øè¤Š÷A¡IõlÓµDRŸ’Oç|šÖËE¦1T3¹ŒBp“,ÿS @$3ÅbÊÔô)|¥¦XGHÔ,ÎxÛbÕû™ôQß:ŽC„ÙÚ8P'YLÄ5}¡û)¨¥éü»Ž¡Óƒ0W³”*ñɡڔ=ª>5µ#Ÿ†&·ÏT¾¥wj”Ù”Î19uË^ï0h{)›Ò`¬@å<Ø‚t&m=XJƒ+âOÀÕ¿þ( M}2ýéMÍ{´oHWk÷€:« ¿Ô¾~€ÌXôñî`«ÖúÀÔ?òpöŒ}ÿÀgS±Ücé_Hp¦“@¸´«{À™fqü_ÈÓÌ ñ\ÄZ‡€?š{¨µP1½ZœÑñÅœîaN³X1>†8dç˜èò´RÀúFøOLŒ¸ endstream endobj 141 0 obj << /Length 1338 /Filter /FlateDecode >> stream xÚ­XmoÛ6þž_a &'Н –¡ÙÖ èŒ~YL¶™Xƒ,²œ—ýúy”"YræK?˜<wϽªtÁ?:QñDiF4S“Åú,rÔê~‚‹/¿žQÏcØáüivöýµ‘$Jèdv×5[Nþ~^¥›ÚTÓ1°‹iȹ>?Lc˜ê!3pBµœþ9»9û8k± ‚³#5k¸‡êÉžzЍX–’D‚£ŠW»û(™Z Qð~RaµQD «H)#TPdþÝlÌ ?ŠzÌÈûyQ÷x#ø#Jø¨äOåÀ›E{î_ÌbDvDbå¸Cáììjú?+ë4ñ Ì{ïž âDR"2ûN·—%Lãå´Xz®öJÎÛ²¨WÞŠOSlÍvL›´ZËø8ì·i5t;€ãmú<`VšÄ£.ºÙå58†15Ž‹”“œpÀ“Cç{îSœ Á¢ø ói¤5aâçWf»™†6½u†yž?O5 αÔ+S´+»àÁ2ûQf*S,ÀýîlŽ"j{ÿÑ Á[¼¹×Û³O@Ïie.P[É»Új’pÑ×î©1Ãh 5@€}ŽË¿iUgeÛòÛó­Ù¤UZ—ÕXP-e#ôU· ôá’hð‘¿›£ÄDQÖð̳<§c²X !®Z6Dû®¬Ìž1y¶­‡vº ȉ {‘¹X@T½Úž¡zL-þìü!"—&7~%  8ä¤è¢@A±Pg!<à_’`|á h•ÉÓÚ,‘^—=FÀ žlØ«k˜ã<÷$¾Àƒ×61̼ڥäw9¢epµ©²üa¦‘týl¯Æçt¯Ý¶>Ç€ŽSÎQÊ“ Q˜µ}Ô;¹:Â1É[³]§yŽº,¦ðò*-î›,÷ކ>ÂÔ1Þ‰Uëz·j˜=À„1Ê^jÄÚ:¦‹9РxÚ½ƒÜ r&xß6.G‚²°L«C`AùÚ©a¬#l PÚ‚gw‡€J"êˆ0V„G¬Æö0Ó‰6h¾µÖ’]PÚEË£I„GïlÖÛ•&¬ –Ðêÿj™„4‰ö‹Ã«ÜÔQü äÆIQÛ†Hº\fM5g>‚<»7ëë3ÏH¶Á‡X9Z}…$R¾5´Ó»vBn£ûUx“˜ujùoX9Ôi¨¶ 4ÒÛ]âéÃTˆ ÍwSŠ¥Óg&ÖËnþÖ8‰8@v뮋…@c! X5Á YH˜„¤Ÿj¿A¹«7»Ú¯­0ÙL@X”ë5Z›¿Æ[8|`pÚ˜\ìÖËìÎëþƒ*}ðÛ¯~šqmØ ÊyÇ1ß¡ß`²û —«ÔˆR rWte*Oô†@-ܸ¨KNôH"E@ü:ªD€è•`Γú/.>YÛ­q»]•8“¹Ýã*ÊÛE¹Û¸éÌn,ìNvX»Ì¼ÌlÛð¯!²â·&í «³µlhÿ]Ó<¥‹fNälÆoJ¯ µ‘³ÀÞ®êÍ¢cðAeSIsB¤NÆSpäsàÝ»Ø:šþ——8T¿>” 5‚õ¾¼üÑOøþÐíô%h£ëjá¾Æ?®t¸q V™×$t?Ϻz¾èðî‚ù£“c~¹æTÀk>?àùÕ|[æ»ÚàÎT•-5véŸåÐA›?Òs¤~±S_öpð%Z3­yKmB6¦õqNá§\›ùR-"¢Ôÿö[þøÉ5Ë endstream endobj 146 0 obj << /Length 1032 /Filter /FlateDecode >> stream xÚµWMoã6½çWÉh8bù!ŠTÐÙ¶»‚î.°ð­íA±éX¨"”œ4ÿ¾C åÈ–œõXû`~̼y|œ!i>aðå-&ÚHj¤ž,ÎX;êî'ØøúÇvF=Ë_çg?}TjÂMYÊ'óUj¾œüE~[g›Æºi$¥$òjű"_§Âësû3ÜhEôôŸùíÙ‡ù.˜ŠªXžÈ¬³ÒKúô8cÔÉ„2#Ë  ðóõõ4âL1ò)s,zPFÞÁ˜‚Y.¨Rž$Œ¸¤\ñ@€ëë_^”±HÆ\\É`Ür÷S¾xµZ¯~¬Ö npúý]]ÛÆbÏ:W9l† 1U¬û؈_âèW[dMþxÔKReT¢´ÔLÙHŒ‘Ž>ã Kò~³¯§S"î©4>7{+õRø©¨›k'ÐèX˜‹Ûm9`!$eÁ_£ñ]jpækBõäØÞÒ+Ñ4Q?”‡ðø²h†‚0NãK$ùÝ.Fˆ0ˆðêÖ¾ìmVz+.®øaÉ"™×â¾8í* Œ¬JVh77ßcäô8Aƒ‘ÓcádN9?Õo8?8•êÅKž|~ŒT¿`/ËŽ”T—ìMy˜ôóЯ`^5YM j¾ R¤ § ;‚À{<Ž!pf (3~sì8ŒmþI¡ÇnýˆoHN–wÓÎäÉ  çFƱ0v6zWÎf³Pó"ßåEÁϱ³ÌW+ëjì¬\õZûÖâ܃>^üJá›Dp¦§IxüYARý›—÷øŒÉümÖÖ7bˆYoŠÌ¿ižÛ‡ÍçÝ « OS¡‰Åvmm‡’5WÈBöÙ(š¦)ÒÔp‰dþf\1‡WB# ­1AU¹Äv‘—a´Zá/€Å  Â<“bb‡×ê;VšÈ¤3»ô°)É©¥ðÎSæ…GÕ…:^¡&ËË §é³Ýd.k*€ÖYeÕy;gk/ªÈeV.ì%–9—’ÆÀi/W$ù ÷©Ýj‹ƒg!Q‚E“»ÜÚ2ì¬-lÓí'f“oWN0 ·ßžrâÛÊÑÑý±¡:†tä Muò=0÷šÆ\¶»^û¦€t„êƒaN–8ÐThÓtÆawÖ5öáNòýmæžÑ#+—8ïÛ…ŸZc.Œ[ë¶ ð}#¢>p‰0u‘߯ÛHÅs¹­”e_^Ž)|p ¨ð¥Ç—¤Ì¬)4ÃeûÆãT)’[/”ïûúèpbÿܳe6œd.8ï¯Å´‹ÖAOãkAHò¹jò…í€ýâašõ”“ ÔÏ?å0¾£þý#¹} endstream endobj 150 0 obj << /Length 1602 /Filter /FlateDecode >> stream xÚ­XmoÛ6þž_á5&£1ËwQÅR${ɰbk"Ø>l¦Øt"@– IN—ýú݉”lÉtâdM>H"wÏÝ=w$Í&þÙ$æ“ØbD<™¯Nh;ZÝNÜ˧ŸN˜—›àlGò»ë“7WJM% MØäz¹«êz1ù#úþ.]7¶šÎ„‘x;I©¢÷Sn"[Ýgö3Ì0«ÈLÿº~òãuoLqE”G"뤟€—¢£&TIÐþ³žÎMQÛÀh-KÄ«Uô>-è&­Ü §4qoYíDš;ëš»¬Z¸×²°n2+ÜÀŸ”ÉÜ¢ƒ€Gïâá’Êbð¡s“å9órÜ‚Íu'–‹Î¨·TÛyY Íko^=bžñ˜h!wÍóyn@¬7OPd2“0š09„)ææ®ïÚÈ@²³â¸J›¬DBFÙ”Eµ{]WYÙÆ.œð ~=¸É›Õ"Ì¢ÓãžÎW˜GµÁXbŒ&Z*æôuh`×·ççÓ£ŠbN1‡À}íǸDéÖ+:tçô”{ ççïÕ ¥¡ÐÍöa]i^Þ–›:˜ëŒÚsæ×´@Q0Ë8Q*ì‹Øó%¨@ïJ¶‰óimîÒf,åYÑ¥ Òß¼ƒÙ9.¼ó)î×ûUÈØeãgŸB‘âPú¨âÐ%´K«®€Ÿ¶È(­`/©š7WZB*M¸fè‚ûqH!¤VÃíJÍbçb>ÆÜð¨²yÚÖ7¥l:¹¦lÒÜ¥«rã*ÐM•Ë‘ì¨-âPºöCiU{-y]º9W°¶²N)»ÀÚm-÷¦<Ž>£Œ_èzS}"lsL„1>K&Ç î€^^xÜÒa¨e,á$Ó™¦&úP6ÙÜðnUv«<‰wôx<&bº¥)")¼†¶aÁÀá¶;òóqʊÔe,T#}èùLµ¦¿{™1$fêÅìÚ±·ÝLwè‹ãHßöÙ ®`#áúÚ}_aó´7U»= }†Mt ›KÞ¾'Ñû °¢°þërs»©·Øo¡,ú8oÊG—ÊkȈ%Ø“-«œÃ iQ<ÖÈHž¹´è3—㟌ú‰>ƒŒû´-û2#Š©';Ú0CÞXZyr¥ïÅëÊÖ¶¯܈ƒ]-‘$‰¿+¸ÑD2þbVHª}ÉIˆ‘Љ‘üé¦{™6Øç ëÕ7x°¨íq×/Ðh{ÄùìÜ®0vGܰ;¢¤?Õàke×y:Gþ¢ÈÝJ)"µz2ÎCàÝñhºïJíILÄ ‘rt›—.çiVdÅí¨sÜO•†ö½±=‡ð¸…Âвۼ‡§b˜á€‡ûƒKî‹ÛCîzêb£KT׊a"Ì  ^¢ô3i ¥#óu¯E×sÀˆ]­›îh:°ž.Ý­&Q[áÚ®Ó*mʪÓW;W‰ 0¬ÄD∑D›çÖÿc§òß³n£>³óî¨V†0ÄpÔ‹“gªšþð¿=öAQl½®{]Gô]k±Èð¦à` Ê›ÆÐJè–8?/±ÍrÈ6ø!€å«5¶¼° ±Œirp³ ž1‰¤ì˜¢ÝªÂfSn‡yS·5ˆ¯®~z¹nïFÁ êEôÿì_¤‹ (1Ìì2Y'[úMî1`nð‰!Ëmcáæº‡ {ĘUVç6]j¿¹u;eõèŒ^®7~oqDDýÒ’ÀæÖ-ð¢·ô f¿9.OîRx(ÎŒ%$Þ^‡¿y26ÃVK%\XÀ?A¹åèo°¡ï|íE îF{«ÂË_|gD òäVÃé[æoeÏÄrXQ 9L.p74 qqqÐ?óˆéQ£ïøØhØù‘uü¥í øÆÝO¶ø\f¹ŸxÕr啟®Ý³¾+«¶5ãæý*ØÐ ãÙÅW!“GEòÿÿ”ðÌëwÏŠ=VLfhUŸ gÿØ×)ÆHމÀvYeàv€—7u™oŸz[U¥Ïqg–pª4mÿìk~æF?á"»?¸ŠhÍ”0RÛ×,àëq/÷ÈqeoöÈa%qü¸†]r<ì‘ö4®Âä‡Éá°> stream xÚ¥–ÛŽ›0†ïótÓ ¢wlcŒ£f•mÕVŠz¶¹«z‘Ýõ6H4‰È¡Ý·¯Á”“ )¹€ØžþÂ`Ô;œ8<¤(¤Ü¹ÿ5‚l4ùéè‡Û#œ¯óÔB¯²òíjôúc$@`gõX•Z=8ßÝw›õþ(“‰G)uélâù>s¿ž'$terŽäo5ƒCÎ\1ù±ZŽÞ¯ŠdŒ0Ä|ÚÓÙ¿Õ¦½ j P™ 0_;\LÒ`÷æî°‹OG©ÿÉ$Ù%úq®oqÂd—œ’WzôVÆëctn(äÄ*äÒ•_S„Öù½ÆU[£—ŒÇLµ)P]z3W¸Ÿ× ˆ, ¸/ÕS³˜ Æl9Jùü:Xžâš@:æû*¨p©ºDÁPÏpž.3“V©½tæ-£2i”6`‰R;Bx¨V,ÍÏhÓI”Q…“zÙ +}àðU£ E>…€s" ”Sl©µ“¢²À€ãfŸ{ˈºJ:¾É½‰Têpíph/i-pèüfGÚØ°hpô逅ŽZÙÀÁö†ÂQºnys<[ËCDX·@ÉÆ—ÝÙ  wÀÁ»ÞOmpðv8´ ààípôè€ ŽAl¨ÎÊ]îɆÂX¹.Ôá"=<øT)* 8–§­±·„¶Y TŽ•õV½J`ÀAš 8´—®´¶S%Ë?àTÁ¦¨‡¥a…—zݗЃéÀˆ•QÿC‡°ÐñÜ7Cm›D•ŽÔš×vÙÙ]lÄ-lˆv6žM?ˆ—"Ñ5iºë×› UO͵Ÿ-Ÿ¢m¾Ïºín´Õ÷Ç(Î'®î¢8&WùôAß›]’}v§Ž›u%ÿìåýQ>¼è EúAþ‹ žå endstream endobj 158 0 obj << /Length 1350 /Filter /FlateDecode >> stream xÚX[oÛ6~ϯðš““š#ER’‹¦HÛ¥‚µº¼m¦Øt¤A INæb?~çðP¶eÉn»oçò+©ˆ‡_1ŠÃQœH–Èx4[žq·[=Œhòù—3áé&@8Ù£|{wöÓ{­G‚³)ŸŠÑÝb_ÔÝ|ô{ð.KW©Æ)e _Ž'JéàÓã8LS=ææ N„Œu øøÏ»Û³›»­6j¦•üFh-u_´OpÎ@1®AØqm±˜~€Æ¥Ú}m‹uããoªÊú@·z‡ÒÌ¥|A»ŸM‘6ùã7r…ß![ÛÂ^‚|š5Á½ ¦ÈJ³»Ò¾ª¶,&í¡œ¹O‹‹ /妜z»8Y•Ig™ñ´OÙ–¨©6yùàçvKë ‹]ù…ÌÁ ɨ õ}W¥ð*³Ô×âÒVf'¯>¬ÉâC®ß‡Ò-õ&k¥§uãÑÒîLYTv9¨à:?·–íûùòòÒûùˆó|±0Uý¡SqxË y‰F_ÆLKßÇ?®—óü. *d¨‚™]®Ò }&AXiñÊy¢#g6N€ZUuóWQPî>È ¸½HsXTs’BžDNÈÂÕ¹]B­™HB€CäÌÂ/C&bÕ’=åMÖ¦0Ôë±Å€ qy Š)Bä‚MŽÉnà‡AB>†ˆáDSO†ŠE¤X2P Amq7” ®t9 Þ®ÚYUö>½/6´¤5q´ci=áS–6´µÁÐØµßƒµß°å ñÚr:×3ÜÍh•Òá,­ ¾*¤ÞØê‚®m h¼‹÷Y³ë9™Á“IDL0b)ãèó‡†U¹ñTvDl û,>˜ÔéÒÏ––83Z’aBn€IùU¶b³Ít}E&zHbÊ@â ²-ë=g£¢Ú|’ªe‡7˜OaØsÀÖKü{ïDšŠ•PlªÔÑâRØ%pêªWiù  ±1¹ó¢£yci¬Ö%ý½Æf£Úþ£|¾îÑáä•à“9ÍkãI²¶‚q‘{Pß›’Ò¢²eþÅÔ‚b£ط簇œ¤˜hZµÅW¸v€ÑÒÕ¨u9‹•w×ÂVK lRÎnH%O^Û’ñŠÁqf+€LüPÏ[f×Ý!hšÃƒÂ ™ÖͪUITð×PE+0FiÙk‰±Z,|Îû³îeü…’áš2a² %õ«ít°/àZémïú‘È¡xpM"ͦaÜͤ¶Äjpú ¼)ËÚßk|øˆnr;9'»—<ù ò¯è}°ÇH|·iÙPHÉtã0:|µ7¸¹ïQ'š³8îà8àúVýgoÈ´öÏåð“ðͪê!СÃ{Á¦§!NX¸Cpì|@ØízÈeü„–©è1)ç¼ Äq‚ Ç?¢NxáøçAøžÏ“/Õ>ÚÇ—؇p‚`@ÜÏf6‚Ã;؃ø×[Yî¿ »„^ìwVœÖçîV‰KD÷öõïôî‘×6ðeN#Á"îÕþôÃÿ$ü™…ïå endstream endobj 165 0 obj << /Length 2276 /Filter /FlateDecode >> stream xÚ¥Y[oÜ6~ϯ˜MT[Z‘%M°)’í"E€©÷a‘ Py†ãQ¢§ºÄÍþúž ©‘dÙÎfmÀÉsùÎ…²XÅð+V™\e¹Šr•­¶Ç'1Q››¿¼ûçáøB` Gœ?\=ùûÏZ¯DmâX]íÇ[]íVïƒÅ©3Í:TJêÅ:Lüúy-óÀ4ŸKs 3Be:býáê—'?] §i©#¨¯Ísß•/Ë'â8ÊWéfeZ±ˆëPÄ:~.+³Æ‚§×eU‰§<Ø•û½iZì{toSnù˜Û#”9œ å0Açõ”–› =X´Ãm‹Ã<èEÇÝÁðËb‘Tl>`([¦îlYß8Rçhí5¿”µßÍíÑ”7<Æí}‹ïþù²ÎUpÉÔ¢míd ¶eѹÝ9ò *kã*¶[ÛìÎ,ö|¨¾…Š„¬ëÑÖtö¸têT×YPÛŽ)´ŸtÌÀQk¸-îø÷šÄ3M&*x××5 ‹?ömÇ Ü6éØr0"ËÁ´ù³kÌÑT_˜Ü·fßWŽ¥f–¢‚ã+~oË®sØºèÆªÝ . $³=ŠÆ¤Š@i{&%A¹ç'K <#)qºå'¹È6ŸX?ܳ]8è¶l`ŒDåÁ¿×y2Ðä\Ž0·o½3f玶žÖvM¿íX'PrhÁ—d!{f1A ÇÈbFË•q%˜vÌ :ò Õ˜m~E’B;¬Àdw`ÃÄAcþèˆHtÃdp#Sìž »ôP¦1õH<{bO2‡91žj‚ò‚¶\²-’(Ù‹|‰tžì3²*ãÅÆ%ÛÂI墭=š®<š%”vM¹ÅÝ>ùh—›4h|ðÈ<>‚Ð?8 )dž‰#òηÆÍ;F×´}Õ1ý4™D13S­ã™ „Ž´<1¨„ƒ­iºÇBnñ$Tc¼P]wûWããPûeM˜¢àRÉ{¨·¨~ÉKQåYe’jƒ ~•ÆI´Ù$T™" sãHH*QSʸVùõáhƒ…Z:?ænAÍY…÷P¸€F™óæÃ%OÅa.ÏP¹ˆR¨‘cî/­žûqç›’¸ÎˆoX¦[¨“Î!ž*r0üsgÀé—Ñ4™”Qu;ÝÈi%fKEWÈ(Jì5ÕU!}Æ“¼+¡ž2ôZ: Bv³eí–ä `ÚÍ[~ög›¶+ü:N÷2®Þ»Y—{Ålˆ¨/5í¡±uù_s–bᤠ‰¤-Ó”s.Mé¬ó –dEàœ³"ÊW3 6¦‚¸q,çt ,åcª6J[´bæ,mÍœ”ÂÇ<ÞU)¦ O ²ç‘Ö–ê,7™w¼,´8¹³w&¸Ê¦ÈM5N”©,$äëÊmCÆ„'–6Í´“„>s“gÞ6á~Ñ~ДBð{$–ÝÁöo[Ô¾TÂÀ‚ð£ïv%š®¨Ü’eßÛf¦«7Ï%›GŠ$J° •€ªü䛸>' ~_ÒI¥‘ŒS/nݱõe?„{v5ÆL¢®wQkíµLóz@o‚kR]{ÄÀ‹/$XËÏ£¥vI„¦¼ÛÙ¶8º·sO¤©s'öÕÎmpÍE§®ÙÚd%¡u´QjH®!hÀÆGW¡NSZÜ™ñʃÐÓ˜ƒ#®l=ŽÑÕ>*Ž–;2­ƒÂ¥¿E˜’ïLUKðj˨§n’d±WÔ/hß ,ySo¨ú<ˆÏ4Jtây¸½Ðãö{[U Kq…ñÍ,Œ^|çep7hnúãÐtáLé6äîXкNîýx1±Â¹Á@@ÂBóÏ·Ë!¹ 7q”äùîGSÔƒÿ|ÁIέ\õñ¹ªz¤Ü'i«U’Ct¤ùÿ^íyy8Z¿T짇*ïÿÕš1^F¹vÈ .4³<øà4ð…? Rq·ð&R1Ñå¡ÂÏ܈>ß”dwùZÅ2"›b÷'îÆPü4ã2™ú+`ŠÜ(UÑîso '‰yžZÀw’ŒB€2 ìßö'Ÿî @¢\Ÿf#” Ÿ©ö!A¥.:Û Å$ÓœEÇ2×pµdRk¸ªáeÇ:ßðƒÐÈ(Õ‘¤e z"_G}ûtÎz@m.åÁħú\š!}qàpÍÁM»ˆ­”iL**I%Z Z ™EJ¦,ˆ—ìT¿¢"ÞYìq \Ð=nÁÜØ›lÿo;·wòßX—O ¾”8P;ªí›s2lÚÎwŠÅÏ=ÑåÊ5èo¦ù39ß¾¸/[ÀŒDÓ!×UeÛ‰%”Œd&Ç-ÏÒfð'Ç{É{÷RCzuCÒX:D0§˜}@ÚnË©1ÅÊ8„TàåTê@ª_l{è ú**& Þ3ì…ºHJXÛmqÏ go¨:U5RIávÞb æx F§Yn›‹â8ÖИIedy*$dˆX?hÒxªäëû•„óÇƱÓëB¡(ý*åâx“»/?Ò ·¿˜(˜Â½#tƒö †ÏŸ?_Úÿ5 ¬ñ“&¾à7³¯°´@®óØv%çÅjÈ4Œ‘9Z(?ºO)K-óÖRÀ‡vý÷åxÀ®b±×ãØ Íï…¶€[^ª†«Áw÷ÔÛ˰†Û rêñpö³dägÏ„sâ³ð&4¼ýãåK¶øw?ƒ,­{ùò{^÷zi;ðª¸õê1yÔ\ž!–GÍåa„ÿÂè¹0œ–DÏ%y8¢^9ó]·¶ê;÷-Ü4 öíøêN¸‡û1arÉÔwxY,?ß»JNVéGôý>ë{7ÉQ&C-ï×ê-†/ËÏLÚ³Ïþûÿㆾ,à ;nÔvp³ûÛÒ‘"ß‹-7ɹ®çl½h¥»+ORá·»ò™ü§EÒL¦J™0ó½ê_ÿc€{ endstream endobj 170 0 obj << /Length 2405 /Filter /FlateDecode >> stream xÚÅZÝoÜÈ Ï_áÚyÐ"YÝ|é+8q—âŠR¿5}PvÇYZÉ•´öùÐ?¾äpfô±³^»Wàr@$Í’CþHî…_0ø_dâ"ËeœËìb³ÃÌj÷ý‚^¾üå ·tk \O(ÿ|ûæ‡ÏIrÁY\°‚_ÜÞMEÝn/þý´+ïÝ­ÖRÊH~X­•J¢¿?¬Déî¡Ò°Ãe–D\¬þuû×7?ßúÓ‘ĉ’/TÍQë—NõãŒÅ9h™Æ,Q¤âÕ•%RÐáêƒ\­yo?^_¯Pd´)Ô ÎXsó„Ÿæ¹¾þH š¾t×µ½ÚóTÀþÑkõžV¿èºª‡“\yÌD’æ‚縲“z§è´õyÃ>¦KÃÞ¾}{Ú¦¿UÕLУjèyWÕvã²®ú_Úížžý®íLÄâǰ+-—þõ^o½ýSHËõâOØyÂÔɾµ”/-½¡Gƒù‚/58äÈvùÇØžd±@°˜Øç¬^Ïö¼s”5M¶§È"V‰ ‚wïÞOX¢Ïa¶ÕÝî¬w]»,.I8;`Xó4Î UÍaB`‰jJÅ,Ë@'Cxß;À†uN£IÔé{Hñ<ÒBÛÐsØi"쇲ٖÝÖn†ûƒ%½ÃÔAm¡ñ‰Ö¿2®t½¥½ön&v»~ ]ü¨íÆã®Ú œmm+ؔ躀“Ï/€<† MÒ¥Š6m×émÊÀ”mÕ|§õQ' 6:\2ŸðHo€¾I­ØœÌU\(5÷úíƒO*fý—YÿÁB‡þj»?Z+ {¬Ö­q:ÐUmÓÓ¦Q ö<‘U¹Ÿ¼yšûÎÆ²Ö[/h1.ñ/@Ž~!¥«¾ï ùóÀY[ †‚GŸW¹¤+áó²ô¨€¼äti°Ö¥· ã›õв™‚R:ÚÄP2O‚HkÒö°gšo¸þDïV8Üú“¾ªioûêê.R¥9bZ­glc€>ÝŸhd~¸e Ò¥±x?ëç¡ý\aq&|a€òi.«' 4 ø¸+‡¶bL(“ëìMàím €=¤BU«7Ù­& {ú×r_C˜ô7XzÍöêŠû‘/;Ìr³©¶º9Ñì3ŽÉ3Œ‹–wé<¸#èÅg:îuIP§°ýÜ›A9©bZ†àä×IRtÊ2a`M6azi·â¶bÔñ‰µÁ€ÄGÄ,‘#£=Œy>’\…°sRP?¨ež¤çÍTOŒˆ[5b[­LH6n6šDlÚƒñ¼Út cÞ°nJ ®µ'¢,ÁNïM$? 1tZô#±¡˜8PLÁ]Åàº^;Ò”î#uÃøy!3ÉÐX@>¥jTY„TæYÌóÄÑxUÝx¬ê‘ZP½VØ’e‰ël¦´>úM, ð– S–‚N÷ïÝ`B ìÔ®¾™¥£ŸB¦ò"N¸¿Ò/Á[1ãéìÖA²ñs¶ðóâOÕ,Ð%Ï„YúÃígA â'…Ö2ɱÀ ©'UœsßVÁ|äìù\Åráû½S)5Œ‹3‚‚¼öô»^ÿˆÞÃÁ`) aT~s~i‚%®š%G„Z5ú*ÒO”&g‚ÎJÒ˜¥üvz‡¿QRzá`œÇ0m¼ö&¨ êµ.{;·žþŒiÒ`?Åý¦»ö„×sËÿÅç_° H|Üü@Ï=z8aÁQBÄjŒˆ—àDmxœ±â¬”|‰*1tø¯ÐDüM²Iü/:"ñ|Ö0,ñ³áÂTr.qY s÷Ù€ž 2Í@*f=.|6ø{¬H9D–ûí§¥Gs–ÄÉ ’irö$™PðÉd,UéïÌî*‰É`¾òÏ„±qžþ?¢˜¿\Høç1ã^RäóFàŽf(pãÔ²ÕMkþχ(¤›¯$:·ÚÛŸ9ÍB¸ŸñŒ~Mš+ülƒI#Ts–M™ËÊþÞs9”GUœ+ljÿjà¿g·üù endstream endobj 8 0 obj << /Type /ObjStm /N 100 /First 833 /Length 1876 /Filter /FlateDecode >> stream xÚÍYY7~ׯà£ýŠÅâ’HvÈáõƒ"õLkºçßç«n®î±%µ°»/j6»X_],VQ^åTŠX‘ËŠŒ²É("å,&³ò1*²*ZVU™%PÙ¤¬™ã¾õQY&Ñ*ëÁ)á;Ö㔃NXB‰½²@ÉÞ(” A1e²Š±Ôæ4`@8rŠ±ÔƒH–:°ˆ<³H–)«>™¢Â'›°.VA  Bô OÙø¤"42Ð.ŠÀà àPŸ)è ‘ŒU ¢X€&§·¨Æ6ü¤2ø1¾gðcðÅsŠ*ƒŸó0ŽC—aŽ’¬ÂÞÉ<}Ê2`2àÄD$š&€„‘ˆ@¡5Ž#Ô#T‚\Î*g :И”âÀ|@p’ã’…Ÿ¡>~”sÞ©€¡Ëâ:¸Ú³Påà Žt"8<…;º,Þ…g,; xÅQ ëI:g– „G Ë „6ÑÕaÈÂÔð2“0e S`aÁE™±²‚á‚°°Çò 1îƒ ˜„ˆ ŠB(d’"Þ@pHÅ|‡h%ðWÑd7ƒ/Ã7Ï 5üetW †ßWåª(WK°³^ †¯Šeµ^Œ‹%¶Y=ñs1™Ž¾«>©w>{¨F‘Nùý\X®rMüÍ75ÿðT/^¨áM„<òEáËð—E5~]¬Ô;`¿¼QÃ7ŧ•zÿ¸¨S(rÇR!ºÎkømYVàöNÒ…HƒX­õçcjâÁð»j1) {ó^DCtdíÄôÖiÙô–³Î0<ÂGÞA÷zýçªæóÓ´ünµ!^«áÛW?6?ÏîGÓÙªúzúq¾˜ÞOŸVÏgÓ?‹EõlR­žOWÏÅX]p~J@ÇI[ƒ°ÊZvˆ·^{DkL:YÕVžª7•¾TÏ~ø×ÛÿgnE!Ï—Õx}ÛVÓª”‰Ÿ¦ã¢\ýÄÂó^³ä4bœìRx,]K¢]ÈyÙ2µ_1–­±cÓP|œÇ¦N}â’Óq\rè—¶ Hk›7×<ml£ˆmt°ø¶‰`nš.Üpᆠ7\Ø&ÖOr!NíÏB²ÚÊI» ­Î‘:=Iý¢f é2bf‡¬öÙv"Ú+!Z£-òõ’ñ^ïï6$÷…t:°¤‘ÍwD§e·]é:˜> kn1}Föà'0¯¤§H»ðÁñ©MŠÝñJ»±Éwc¦ž˜&kg¤˜“bé ¸;f)_ Òj‡IV'ß´–®ƒéBÔRl?bºd°ºMë•0ävùÀ¹¤Mî!w%w¢^Õ9ìTG^£ÔêÄôæ:˜ö¨Ì19±fΘ¯„Y×»­‚šzwg÷௄i’ÞKBL jwo•xß_ªw¼9Óûýé”"ê4!åz6{ßQìÕÛÒtx#3u‚øö¤ÚàP²ï«ùßÓò®oûÒ¢úvü¡¬fÅäN*šeC}<ÙZõïÅâã´xhÈ·omºõj¾^I‰t[-îG« ýñì“ü…澚‡8ÛÙÖº²ÅB¾W5Æ1^u+¿«¿ê2î¶&n3y5z8æp8ÕZñc¹\f³­µ÷Þ;h?VðEø•ëûÉôööqQûCku9Y3Äj³äu=Þ¬\±”Á¨œ4ê³Ércå=µÇÕý|´˜.«ò Â@u~yÂþ[;¼]nVX|çˆ'Õüu´(±tŽÛ·AŸÂüdâ«LŠOfágúCÊ­±©ò/î7 ⬦Ðâl@šÎQ{´^¶NÓVºy?©'ükµš=><<è»r­«ÅÝpÖØg9<Êx´i]>—òN$ûbfìÝ(QÓËvðÔËAÖœí ‹ú¯¾D†G'äЭÛH*šúýœ®½D ­õj>®JiÞo×Ë¢ž)‹Õ±«6 Ý—\uÙÃU±í*ßÏUî|W¡»äœë:’åž0F]ßðåúýWͧåh1M7—+ë{(»(F³úmÇwÔ\쫹¹U8_Íݶ×1«ÖKö—¨¶˜ìúÞ†XôQ®ÔâR®ì3RŒÜú£µ´±»yªÙ·y¸‚Íw%ìѵWÿ8sí8ã¾qæÌI»nŸŒ¢CŸT-ð<×@[£\l‡Öu¹Ü÷÷´ƒ¿†ï{«æM[µÔWµüÿ¡Zûïo{ªæ¹·j«“Úêœu MÁ´Ô‰ÿ3u‚o©øuö}ØüÓlï„/ÿôùûÖj¢âD:°üËšbèLø‡ýÙåÐ.h#Wk¬Áœ²6ÐËe‡§û6èí²hõßÕü±óúªuìwR >"sŽuD \¼¯ðalg«.ÜÿeÅ 2 endstream endobj 176 0 obj << /Length 3017 /Filter /FlateDecode >> stream xÚÅ]oܸñ=¿ÂM^´‰W'’ú ’ ×â|HQ4@ê¢É=ȻܬZ­´'iãøßw¾HIkÙ1Š…kHÉáp¾¹ê"‚?u‘é‹,7an²‹ÍáYD½Ý× >ýúL Þ×Ì?^?ûé*I.TQ¡.®wÓ¥®·Ÿƒ?íËã`»Õژ׫u'ÁÇo+¶ûVÙ[Q&KeV¿]ÿùÙ/×~·D'a›'’æ°Ÿ@ŸNÃ(‰™¾TÃHÈ£`ØÛÞ2¸µ_"7ÕPµMÏ]í¿*(oú¶> ‚X6[:[—CÅÇâÛumÇ`5ðÜáÔùåNƒÛµðà@g>¥Ó˜"ÌÓÎFdþü%J¢F_ÿ”Mp¤‚·ø‰A9M¼îìük·ðZ™P%Š—Çs,¡ukG§‘„<IH#"!)‚O«µ F2éA2”JCúµÃÕ:˲àCƒò-ÜEÇà-²´í¶=.™i¼%pñÓœõ8$¬GpÛ®Ö8Ðs³i6ˆ¾/›¯2¥Ú!•È”.Xj¦c›öp,;»åÖ·U’e}²=0 .âàoU³±nŒT¤䎄?$Løíù[n†SYQ°á‘ŽÛö}uS;ºZþÖ– X>»ú¿žÛ ÄÝVT,ÞÐ`²•ï•Bª²@F„XÖtO%ŽÞZÏÓnY¹¡³=“f7ƒ¬ÝN÷˜‘3¸¹ëÚÃ*e×c£–"öÉȃ»~é´B‘NEpš Ê-®ªc¦ FyOüqS¨BL‡ÑÛMKf`&êiP5ý`K!I€i§¾j¾žíqììÆn¥?vmw@Fžjàd‰’ëàzOØ›²™ŒvÃÜEõO@ê†}מ¾î]CzÛ#Z6ÑËt¦—`LìÍÎújYyÃ8ñ8¨˜&6Øs®ã"Tê"M£ÐDŠìw˜ÀPðOi2äóž©E—éëÉüƒ~¶ ‘ôùç|N35 pjÏW`k]¢EP)vž1‡5 $1·vgÞâ *°ÙÈ2"u*j¬U¶³ Ò¿]²<–d-L}Î-•šPƒKã oõqoç×#öoΖSKg`‹)U!¾ðÃBà‘è[Û²ŠÂ1À à¢ex4jˆ:`ëmÏ­J¾dy À9lWmÊú¥6ñ‹)%$b5mwŽ'GNåˆè,«nÛ ¤5D´sÌ|!qXÄñLCØWÃ%œùj#£çѪwXǺÜQ2ï†Ì ì»0µ·pôrh»×KêÍüIÍA‡ß¿_Ô+G4N1r'h˜Š‚´žˆ§Ä’JE•üa>!T Jë:È Τ"€gbËlÁz•N¹`i KZºÆ¡¬A=´n|¼¡®÷¼7¢,›¶ó.¬)ÛBPO9 @D:|Å'¥.H@‰FKi ’bF¡¢ÛT™|'³7evzáÊt’CГ8ëÖ {Üí–®+6abr‡È2‰±Êà÷r»NM÷xYB<[×x`bذ°HÍœ;|źÈðŠñCw`;ä?wˆn„Xµµ|?]Æ–GnØ;\!‘󉢘ˆtÃŽ±ãOàRâ,Ë®ç” ^U6ú=o|õÙïÞùÛ-šÂ( þyêÝ™„”jÑ#é<Ìç*ñâeRÈ^¼K @oÞB )@p[âþ žŸf¥¨|oß¾[BxÏ ü…‚ⲿ»ª–çuÕú¹ ÷üõGOȵ—2 ŽN§þÃb0ûçpÜÙñZI–ªôdFìŽfähȆųÏ1%C.…?ó§ÁT ’ˆûÆ=ö˜GÙ£þëìqN ͉Àh ê½¥mQ“"LÁõ=IÓ"sˆ@'™Äžw£už%±¤ÊÍ5¬—VÖˆ•:,2`²$·;t܉L¿dÐEˆÆ¥ ÐÞSìþ¢LübQ8 ÊŸåã€5™’fÚc4Kd§G{³ö\ˆnyë ló¦t^ÖÀ»èž±’óyƒ’;#Ñ-ö6N¥@sFFãFc^ p?ܸ‡:òÞ?ÛÁ–rèT;¯˜bpIN,•ð4ud:‹F&ÑÁ†øB€ú¡t¡%´8é›Íë«ï˜HÒšnÒ¾”]Jþ,‰È„¤¥; É\r™M’Kèô/ÁI´$ dAÆ[=º‡EË”‡©ñVÝŽXÿ¾•'¡2> ªdqñÁ†+‹Ua +_±J‘ÆÿAY˜ç¯' ,Ö…çÛœ¿Ffô ŸÏïáÚI Oå8 µ>jáóH–\ÇÍ}7 ´:?_¬‹0Ë’Ùù.ä:ìœæ|Q·-ÚfÓ§Yæ,Í-3ŠIËæ5óš<åv5`ÂÐ~•®lKwF‹«®X& }az~%·…;@î{êíZ,¥ÉªoÉ›ä¡p&;B ºô(ÄG±•sÁ“uç…ѹ½Œ»7ýýäÈt¹,!Eb5ÖÿP¨y à !ʲUsfµ%ïãÆ­{{›.íª±âóQZ·.òëë§åН^½c|µl{Qvl×?Ñ¡ˆÆ^ëIþ²gò{jÌ4tðÉý¶2zü@†æY Ûį­sóRòXÇjþXŠÏeI˜òHÙÈ÷Þ‹`M^  ~·U¬å5“öÖŒ¥Üž»ÄCŽ–œ%Íš nè…G+ùJ€¯ŸU]ÞHšÿ˜ƒÏ2 x3_«åÄË¿Xröeã 71}Äòk€òf}ýñÇ/€˜;B®E…wÚ„ó±l 8aG×D/ÕiAjÎh•>p•eR[ s­µë•ÌTù¶n,|Ím7R}µµk®Í¯¾g­\iÖ½ì.…Z§^lBÌ=g/-çf®{W«Üør¯/ñð»¥3gÉ4»ï÷Ö‹¿®_%6ó‡š33‹½s_ÿ_. endstream endobj 181 0 obj << /Length 1315 /Filter /FlateDecode >> stream xÚ½XIoã6¾çW¸¹TNF¬¸i :¥™CS>h TµéX¨-’’ ÿ¾ä#%%tmA‘ƒhòÓã[¾·(t–Àel–åœä<›-wg‰Ùmogvñë—3Џ€ñùaqöÝg)g4!ERÐÙb=µXÍ~~Ü”w½jç1ç<âWóXÝ<ÌY©ö¡RpBy&#*æ.¾ž}ZøÛ$“D ~¤jýR¿ô¹~,%‰V¿æ1£IQÿ-@bL9¡’ZЮñÇ7‘r½WŠ> stream xÚíXKoÜ6¾ûWls‰6‰TQ|HkôÒ¤Iê ð- PeÅõ Ù•’6Fþ}g8C½,Û)ZXññqäð›¡Å*†?±J“UšÉ(“éj{¼ˆÝhs³¢Æïo/ãB†#äËë‹ßh½q´‰7bu½‹º.V‚WûüÔÙfJ)y¹•ÒÁû/ë$ ló¥´·0#dª¡×¯ß]¼¾îµéDGZÉo4Í£±/3ÑF)0ÓD±VdãUFè8èö–Û¼åV½C«@ˆ 1YdŒ½ny»·¶Œ›(“Y$2áqyU, KD$7j",ùadßѶm~ÃÆ–-}OMYáw¶ |GG0ö±±§u ºéh ÍqÍײºñȼ›­±äÁ*C" ;  -È$Ø«P%‚à*‰v[à 7øG,ÔÁR{Ÿ·øä,°¶¢ñScywnìá+Í76ß®“4ØÛ"Z‡il‚ë=ËèÐØ[ü©Ç ZêkáÇ«ºóZM‘G#eUX[ªÎ nó£uNÆì9ç6ô|Ä_¶šc½–R‡²Bí8„í´q0éŒë¯óÎ6œG‘)mvómW~YkäzŽÖåâ6i¤%Ç­ÛŒ`õ©+ëj)¸´ŠLÚMø~)°@t¢úÜæ íòϼWØ£Qͪò67磥`{>8“öö¿¤££eùáPc÷¶¥~W“€Öv¬Íûr[/­ÌÕçîtîX¢E¼îz3 EKÇL†A9”Ì6N­Ì² =Ÿ ØÚ–zÛúx¬+B¸cWTœ€qvÎII ›eÌʘM›ÌqR¤a.Š7ð#GNÓ‘1KùõáHÀKÍǪ̃lÖdªêú3Ý]˜åh-J< 7' >²O'b À$bîœÒ›fìÛý|ËàG™‰t~ÀU6ñ†¢}(ì.?::M™¥Nìø4é*ÎÊ»ºÁ†æ¸€†Å1£Ì0×–… ?9j ±M£öÃäN\'d ö)¡ƒßjîö¨bÐZyy7³CÉ]ìü¹t#x¦´ô×­ÂSÚíÈy?7ñ>|¯b¢ N4Ž"îÏ› š™—ÿ”–e{:Á·Ì141M0p[âV:uþ&ÃQ³Üå’_@Ï‘½†úd‹8ÄðÕ)$ûѸ¿w÷%cþ*^;wkÕd-oÚ+Iþnl`ñåP‚@©0¢ÅrIÔ/ƒ~¡±P1lÈh"1‰›XXþšQš—'znJˆ ' [ò†‘†qÒÌeõˆh„Y°ê-ãRF©;Ô#¢lAد ÍhüQ&ܵàÔÕpDnu&æ¦ôˆhÀ».™òÎ\cdű÷Ó¥_ÅŸŒyųgÏúï-êCÁï®ÄŠ[Oèº=¡–%{ËàÛ}ꪞ\»î± Ä«C-¸5Î’ÊHi¦¼™é¬ÓÕ Ø8Öò 0QuŸÍ/–öil }Ë^”Ÿ·ï‡ÇÎìšú¸¬ v\æ“5:!­ÏŸ?ç½¾ÏMäBÛ´)Iž,1z˜is‡‚$•½É±¨¢ŠF&¾vAŽ£2FXõ@)ÖR—‹`©+WD$œZpˆÒ«mlµ%| BYú¡l;'¼ ~Y€›>/¥}^ÂÑ¿À‘,€s§’Û€£Sl÷µ+ƒ+_E"¿OJOÙ×L Zu4Ù§+œ]LWLi’ÎÓ•[í3“e&ù@f*˜èßMO—󈌡~2Éô¿#ŸÿùûPêßfÔäßŨÿê?B¨Wî™Dƒ> stream xÚÕËŽÛ6ðž¯Øöm³¢HJrÐK“&iR ŠM{h T±¤µÉr%m6 ôã;ÃQ’C¯(Pø >†ó~‘–!üäE]$©©J.6̓Юv×4øùÕÉp+\Í Ÿ]=øæ¥12ëp-/®Ê9ª«üâ·àù6ÛEw¹RJêéåJk¼ýp¥AÑ}¨Š[Ø‘*1Œ/ÿ¸zóàÅ•£f"#ŒVg²6BÊ_<çO†¡HËX„F‹¯/W,kþ>ý Ø”¡ §±Fæ€ÐJ*!¤ƒoÌ ëáxòÛ§#P!Ã=zôˆ¾Øå—ÈiЖô-«º Ñ×ý¶(†èkšuE¶Ù |»uPCwWí®yÜ:X¬«ÃÄ–“(±Š—l¿< )™æ6ëiд]1!äÅa›íŽñüd¡¢2ç…¾•Ã4bÏúÕ1ÂN²”]Ûøé¿Hn5ʦÖB›ˆ¨>~ü˜U}Lʼ*Ë¢ëO‰,‘CïFSƒú4"IYŸ¯Á–Zéຽ¡I_ 8P$-®ÜVù°¥aË'xOØ{p!8Ý ¼ÓÒ7£}Š,è.%"MV×4üpiâ «oŠ'07ëà§›&¯~¥¢íêz&íyÂŒe苸pÓ[ÈU­Ôb­õÒmò¢Ìnê"š‘ Î+QŒmHÅ®çpÌTõS;T”y½F‡Æ/íPÌ›¦èª -dÝ5Lí2Ã6¤çYÕ4E^eCQßÑBÙÖu‹ ·¨ÛýPµ;¶é"#(“ ½ŽÀ}-‹«·>ÃK >fFÚè0¨ˆ1g—À %Ò¤JµHÇ<4ú}¶A•+•€„â`×¼â$@›ç¨V£ƒ«mÕ`5ž¬û–V¬¸´Éz•m·Ø‹YY=’+WÀ'½ÊQB+é”Sž¥ÄÇI ‡<ô¬™4“ä&ŠŒtéÀkD¶A^·´ÛÝT]A{­5àÏÙÐvw4u&Ös`…"¬èšŠ8ú`ÇÆ˜n·á•‘ŠÀ!r3Zeûy*Â{¢1Lö@tZ …Š;5fÜC^ûMއÐqmîñhph“žrèX8ˆ fvDÉìÓÒBN£¡½.€ÙŽf·¥1ˆËë³3A0g4.é»0¨ Š›b?Ð}ÕçzÑZ¤‘9Ãõôäz<©­ô#–¿¾ a(ŒT‹@^½ûBl‰P&q<½øXb‡å/#bí ®çÁI‘Ä“ŠÞŸf’’YÇÁ¯ÛÂë€ZÂPŸpÀg6©¥Î~Áù¼"k9Næw礣“šû_è‰ÈVt¬ì9Ûãµ7‡'˜EN€×˜§ -[Çõ *‰ààAß´MCINª †Äf;AœL‰DɈ‰‡_¸@ï¬Î(Èz^s¤-4þ/… ã¡Åj¡àô °Š1÷¿¬ †B·Z`¢UIâPòlÈÍ*ïOf Ž9 Só9²³€0{Å•:kV+Bìô†UÂDéÒ T¨Œ«Û ¨lË9w¯Å.ïiÅ:Š1ãI¨ü]^txûKÓ ÝX'p<«ð8ÍöŒ2ë%ÔÝaßgÑ-ñ›™Ï™ñ„#kF;‡]^Qì­+1O,q˜6Ù%¿¿·w”-ì~còº4džâú[ŠT;GØaY,K¢»z«CêV¼B7—Ù8òGo"àF;â|H¼äU¿¯3ë®§fÓ}Ö0Ë‹.dcwj(wré^‰”˜bõˆ8gŠ¡!™(çÚÑ9±âF2›Y¨Å~iØß <-i߯ñ0©\ûY,YßÌê—kÉ[ov®+º¯qLiÈU‘2œ81@ãçÃõ’AcTñ. f ŸÊôŠÁÒ‡Úqb«¦§4eÀØÙi¶cõ{ 5{òçSyÀËü)kŠtêYË>¥À¹Û·ãÿòÑå“pW¨M[í6UN—iMuŒ2º½¤,nYóœÁo0¸ïÏi~,ïÍgf ì=\ÃúPŒÙU‰(N<7»(Ñ÷ÝìÀ§“ÓÅ_ëxq·C¤în‡ºÛEÉün‡ë¤6 #3XwëèÍW7í~ŽÏs.Ëó Åø&/ê‚꼕­$Döe‘µ‘DZ9pèòÀ|–âÈ J\ ²¦P>Å@[¹^»:°i©ʪÝä=L³ø8xJÑÒj÷gáƒ4zfÍ¾æ §xt×Þ+¢Ñ`Rçˆï«º–Þ¼§#è=Ãda ãWÈHFs”^[ð“9ƒ=õ:9  uzÔÉǯIÀ;¾´±•ŒþgA';øÐ?Å´_` endstream endobj 195 0 obj << /Length 1817 /Filter /FlateDecode >> stream xÚÍXYoÜ6~÷¯póRmb1")ê0‚ I›¤Nh] hS ò.׫F+muØpÐßÎH{XŽ×{À€Åc8óqn®< àOÆê0N´Ht|8]nµ¾8¤Á÷o$Óù@èoP¾<;xúÚ˜Cˆ4HåáÙ|“ÕÙìðïëE¶jm=ñµÖž>žøah¼ÓˉJ<[_æö v¤Ž'ãɯgo^ ÒŒ2„zOh=õM|Ñ&>"”‘LÈ'¾‚eOó7…o¤ŒwüÀ•°½âÀ+ ,0„ûR i$1û†IC&”Ñ no˜$1¯„©Ó-nÄl;H½Áì¤-R^I¤Ò1h¯™4bB}Ú[&‘AÔc܆[ w¸Áí;& ÐÆ¾"P#·ü–É>…=§gÇ=9ØKŠè?~ ”0|UÎ&hx¯šÓwž–Fš…µ­~D³ÚfÓ…eâ«Å@ÕÖ×yyÁãj eÂ"/™.ˆJD¤£-ð¯w$J–¸È,«Ú®Ùñb»ÈÊÛi{ }òSÏ=kZVFOº¾É¼®–ãò/Šóû«ipEÊ~òä +ú¶[ÎòùÜÖÍ]B´²›*ð‚‰AuÆBM2OA/*•t/•*¯‚QMk ´Ùøø oKoUÛÆ–Óžx΂¶c>ŠE$Щá¤lôÕ(¥EšÆ=é2ûà2UCìßuËYþ>šdgÅîf{× ­M«å*«†éÁLz fÍ“‰k€¿‚IV›ùlŠ ƤÛàÜQ;/B-èÐCõfQ!«’¦ç¢pPuíªky<§óÃ& ^fL8ùmL‡*Œ„‚ôÊŠ)Qó9ðOÀ®U˸ÐWh‹aLåhž I{Ö_É÷u £Õ¶·¼èóÕúkbH!ë.óȱ˜zÉDj²wÓÎF ß]% 1Ј@߯H숖{×}JÔ]e`\ø‰~ŸŠ&÷Oö`OÖÚæâö9ðíPÕ8¯Á9ö˜OU¾TBn4Û¬ŽŸßYåüþœ+^ò¿Ë©?ä3ëŸc†¸öÐXyóª^f˜bíª ®Ù¬¹¦VCÜÁ‚Ù&QV¤×õZ"seE¾Ì۬ͫ²3’Þ “^ØÒÖYk™p‰8º)þ_Á@ªi““”Óž E†ÛZ§º©!½uM—L¥e.Xl뮜²(ੲϾ ,Üaär4áE1ýÒrQ¹<‹¤ícoö­Ê{Q4ËÌ™Om‹¼—W16›÷lºïu…30LÿèòÖŽ¹èÂf¨šË¼¸ž$Ú;BÁÀ„*© PQlœ|‰¼ %¨Í§]‘Õ@œÜâ9vŽ äíP¦P" s“®±´{91Æs©7Â50Q» án‰jkZ oÁYÍÜÛì|$›¶ZQÙ‚òSSI€£+”fB…%Žœ#«³)¼A~ƒŸ‡B‡‘B?Ç–0±Œˆ»K¹&ÒÞi_åâª\Ì-Д>FFѦBª„ž¹3ØLõ a¼ªIÍ3´åÝÊ:Ç ½ß»†i†Ú‹ýÒ•½/ô@Ôž™ ZaèŒÞÈ…ן–P ][ØÓCI¬]\Ã7£Os3¸„ƒ-­©Ò®SmÚ5õT ï8Iï¤ui¯ï{P2¤ º°Èš(š '\›ŠÄ³¼YÔD9:æ1hÆoÞýH‡‹ñ¨¶’4Ûò(´á^ƒ¸ô1ï¥ G¼^tË’^åàæ#Q™‘c^t-¿ehij-¢tü¬-‡–k)è¡{Ö7Xë“Øl‘¿g.=5ÄŽ´1ôfCãBÀµwC€,³šTZ7ëxC˜ÜÑNC3Ò{(;çŽ:¿(+òf×Oãì4s9ÒY‹t»Õ( ›Ñˆ6)ôÃÃoîŽè£1>‘ˆ¢5—o„ËɃpùéA¸|¼•‹Ysé ʘžƒ ÷¾=ò!³(Àá"J‡jψúsŒ½±JÖ„u6¥€QZmLŒ¯?-JËÞ¹‘¤wP¸§2’$7»& W¨™a*HA>[aÕÆ)¦ç¶–fÕ8Q^öd¬‰DÄ&¹§"ží¡ˆMæ©äNÞX)ï§g ÅuqØyšñ›Óo±û`Æcµ+ë=Ò4N§ÜA ov­÷ê{þwÔ'÷ןü×ô×XÐÒl“ÅFùûGt÷^êðþ×ÛùÆõ£k<;÷>º—ãhþán«´> stream xÚ­Xÿ¯Û6ÿ½EV8§oV­¯¶ì€nX‡wW`÷†û¡pjâ$Æ;³fýïGŠ’c;N߸àY¢(ФÄ)ñE?¾HÅ"Í$ËdºXŸ%ŽÚìÔøå§gÜóÅÀ8¿|öêÖ ž°<Éùâq;õ¸Y¼~ØÛSW4ËXJÉÕ2VJGï>-Eͧ²¸À—©Žx¶üíñçg?>ö«i¡™VòT-p?¡_fX®¨iX¢éøºB%xTV§sGÍCYžØ†Áu}\Æ<:-a¸èܰˆÊ­î<ßÁ¶^ÆÜÛÆ®ÉÈ홪ÚóXß/.¸"÷È4zܾµ­hâµ§Ó2F¿yuëêðÙ/¾%®n_ 1WÎʘKÆ5'+É$‘)§…È´cw Ò‡êÊ“ê­çí<󇄫ƒÓTøÏ•Àq[yþs眇´°ÒUJ¿R[n¼Ñ;Ÿ§ÔM ëÈ¢)ÐÓÕ"Èm»²ÚÑœ¦85K7Ä£´i *ZŸx»ÉìG.ø¯'åy¿„“„T·ý ãšìGâ±ÜíLê~$ÏSÇ…“?пìË©‚=g+6jh5~FK_Øwð Q4 µm0"°å•;%  Ò‘ñbZb¸úî[˜UWpí Ê«ÿ£²Š\îõm‹u]m¦ê*¯.„ýr%4gÂdàzøÌiÕ”äùYBýâws&pÎP<:$ ¾LeTŸº²®æd›„eIÖËÞÎÊ8&ð€ÐÎz•¡GÑ{]ʨg›ÝùèCŠ(pÂÍR€!b8jV­Z“¸¶ðü½ —rÓùIˆaŒ@ 08ÃF§¹Ç‘Ü€vj”/H£3¬þ™è¸.~ÛóéÔmK=8`Ǻ¢vˆm™HЮ˜¦ »C £SêR Ó0Æðð1 `®S†I'Ìf’Ît™qfD=5}Þ¿u6:sëß ë€ìˆç#!×2\ô›·édwñ~“?ÅR8ªCã¾?=÷¦è$e¹IǦàFM‡:À(Ÿá_íT,2s狌ÀàÖÿk룼ž€"׆@é}'ƒïÛÜøN@øà† L¸ï:Ïü„Ò‘Nq"!cIfÆàòϳ ‚MÞUѸSð€‰J$d JTt0k]’lˆÛ…:6ìÁ¥=ëmK´#†z±`kµî!«Â·Å0Ae=:Ûë‘-7´ &*w‚,ë‚Ök}²MWRü"[Ýönd¿‚„0Ù$Žë°yï ]a;j•ø•9¦û“ò†F\.¾”xL° ƒpSÚ±m»C!,v¸ôå’k‘»/j©Ð+=Jy}}ƒËÕǰð¹ììÇC1—È·lHF!q)‚[hg@L$š † |ӯǰ0=¾ÎŸ;½ãEnk{MÚÎ ŽÞA°QÞ"¤Cf3´ì~æ/Û1yÂWoR`œVF #Ö$O¤,Ë}5)™ZÆÚˆè 9»”"ÂLÚÀ3тۜƒ×3ño(œÅ:ò× Ö#”Ž4Ë©ñ¯«¯°Ké[ºª×½ºéˆàGÚóÁ]B¤ö08Å¢Ë6eê0RúêX†2ß‹)=·¥‹Þõù`ˆÕù|‚Ë0mëæh1î¥É}ý¹úÁ„k 4®e5t Û–îFî…¥ZWÐ:&Š$l‡šYšzרc QªÁE)y?m¸LYjúb©YjØ·ËÜ> H##éO«ºj–$궨Fš9 ’:gp‚Fî" ßnM$ÐsnèÜ)}üã\´n#!štpßÔçÝ>t š~E  zÄ€ÖýÂQª Ã?ŽqsÇ3²¯­º¾/|ÑG‹|&Œ¥n(y!5à…ttCÈ÷ª6á[üiñ @wá‹—9K§‘èO@rrè–~.Ù WH¸ »Ö· áÏzHA´÷ǯœ|ÎER0Í{6_Ý^c ¾ÉOËrçL%9“¹Ÿ)¸±„ÝB%O2¦„‚úLÊ«¯Îa~<0ŸÓeѼJôÆÃ¸Ïïa ;êS@Ma_Fü¶øŒÆÛßЖ/T_žû ͧB櫹]‹9°r”8,ÇøŠ~/ág×ërST"޾ûîïÔxÈ3؈S%üpº?×íþl'Ó…TÚÜ›«áÇYÒÿ±Z‰Q_¯äƒ*'B$2q¸}AÁºXLã3+‹ýr–ˆñʆ'ʤÂHYÄé*Õ5Hš¬èI’g÷䯬íÔŸ?ØîÞ$t‡ž¸jh¡M&`ûT ‡ul˜…˜º¥'ß:Å¿·¼xñbnuR—¯^“  _0±áàw†ÿåJ2ÜweâÉPA$:‰Þ”…(â¹C›çÔÁÚJêÐã…k¹Åó9@A2=¹O<º7¸œGõ0Žæ°íÊÜÜ¿Nb# @qNu}­îŠªìß¼$jì©Ö³UëÞ3yôÖsì­_Ó>\BÜ"t!“;©<¢ÐÓæHª/ü˜cÆÜÜì¼Ö á--MPV·‡ä@U)Œ@ýpÂÊÄu| 6ø¾‡yBb‹9)¼@âˆË$ð&vè~€}tùÞ º0\Jô ¶ö.Ç} o0@±ôùé×·¤%^ºò8{˜ÊjòÞ¶…ü¾hŠo@Î’þWCÊJ endstream endobj 205 0 obj << /Length 2995 /Filter /FlateDecode >> stream xÚÅioÜ6ö{~…?,PˆhñHØ­s¹H“"v.¶ ¬<£±…h¤YM¼¿~ßã#uÌHŽ›¶X°È'Š|÷Åágüñ3-δ‘ÌH}¶Ù?‹,´¹;£Á‡×ϸ[ÂÂp²òû›g¯âøŒG,R~v³›nu³=ûgpyŸº¼9¥”úöšˆìÉxwI“wýàâµAÌ9Á‡33zxÞÂp‘··¼Åsîóá pÁ±ïaïEó’Š)9(|³_4 Pž~Ùº¢aŸ]1,š QàЯ‚ ¢d|g‰Âèo‚bê¸ê[½ãÚë'ÞÀãjÞÔÎ 5s¡Ô³>³ì7$yØh.ª]MÔ›¢¢Uu³¥­4ÉmÜ’%•LFb®'Äx0B·%Xà¶¶†·é­¼´—÷’†%$iø*£G{ŸÛ^µ÷!* |s[æëÆ:Ñ!Üà>sæKFo]î6ÏH`¥ÓD>!Æ™·ÖÕ·$¼DM…ÂñiêÐ0„` UF°$òu™YÓøø ÿcâb?„Bdd?PàâÔ™b¸dñÃ" W…“"ˆWy„<“,® o kBýg¢>Dÿ§Âz € %¯Ù´¤Mñ³Ä±h7[ì} @.‡dÀêsÌ„pÒxgG¯//Qž/’¨K6§ŒÍµºù1Õ€’'Î_ÆÌö×b&N%2àêÁÔÿ7ùf OÀìw™Í‹ü¶ÈªS[‘ ãÂüc1O7–tÕX‹¡Ÿ{¹‰(J8‡ƒu‡¶É±Ƚ$¸£Ï~…ðPðu»H }z¿BÂã9ò”.@!Áœ=¡ S,^ÂYҫЬ£üõJù”5ã ¬IKë0~"ÂæODØxǹˆpºŽ0¼ yôW°øº¯Þ_/ØB¢­q™?=¹¥13sn¨Ñ’ CŠÑ• áyÑ"¦DòõTÛÍcÆ£‘í…4ɘ <%ÂÙ+Á™ñ‹`ó(ÈäcDÞ0mת+¬bîú&ó¥G,©_B¹´J]®ƒ£›e€MîX)Ô¡ýv);ƠΜ»ØÔÕ®šóÅŒýãÌ'pìqMsÓc™‡Kç]!“"9I¬an§¿ù@y•ÝR‚y™Âà]ÖpJš¼Íª»>»s¯®û%âuÓ$Ãtw;çêÇHYi‹ášfŸðUVùü«é9vŦ8”.³ÎÊâ¿™oz3h¬†yb5;ë\No·à¾ö™9ÍëÊ&Ç0rKtp§“hIuÞäX ¶4XÛùe‘oÉIÈ–þ®ÉvÔñ„õÿ^®¿À5*õÅêwV8}CŽœ…ɧ² F÷‰"Y¾ë¥9‹ãy'ŠèÃ` Ó¢ A“¨žªÏ'šVe»¨qÊ-ç_ÿ€:ló]Ö—Xª˜/ó,€½œ±Ì•`«‘€Ï‘ñ„x± Gƒº)L=Ôµ*õ¨R´v±MqC-¨‹¾m.ÊTæâvø`†‘‰7C?ãù"“ÁÙè…m©¹ÄW™hKæT¾y·±uvüÛ?dˆÊ¹F°©±“·{ WþÍ‘›$rÈŠÏ´®þ4ÞB³E®ˆr$%NiX”QÄb3XBß’ãí_=ÒénŠtàU¦»âóÒ)Phr1XÉæ,T jû%QcÜúU3~|XO…ŒáÁvjú‰Y&W§Á‹ên ƒwÇ´ýýooÞÿøòËšõÍb< 9¨ŠI’õˆd ùˇÍ#˘^Ù; P€Ú¹ØÛY?ˆ8Ãzü¦."ŽÇˆ$dBš‰ëú6'ˆ•?Bk§)Œ'f·-šE €ô‹›G-WŒ­û ne³<ªŠÇÍ,=Ö"ÂmMÔ£¦ý ºæ—лe™k¦ÆãL!”)ØÊq"†÷yyXBRByšÈiô.Ô‚Ö·]VTGÉfleÞ¹|®,ì5Ò$ÕË|»ÊeqdE‰yƒ[G’r O™âG- º¦2‚ÚeÆ·Ë&íM#&±Ü¸,{ä˜[s0ÔAƒ•Øá¢ÑÏ­õJ0ú‘R‹>so\\œájðŽžon~|ûœ6ýéÅ+÷‰ …08”™÷³$ÐÝ›]_^Y*ð¿Í?w8Òhèû¬£ÄßPÌÁ7YI [‚ y*.µ—Võb¦ñP}B}ñþòÅÕ‡•ïDø¦È»ÝS p1Á'pòÞ·¥³}5‹F—;;¾«aP™ ×QJ6TÚ‹ ó;%HŒˆçª>tá!‰tÑá± EˆþFM<è¶Þ¬ùˆÑÀ‚ºA}ˆLPìüY6é³Pj¾°ª;‚89ænÁv©~ªheW/GP­”?-´9ž I˜ÝO^¾ºúeU?†°ëR àÐ⡚‰ñNÓY·ŠÁñ£û“7+Z# Ý•|«cA$©œjMœÒ’Ìs„Œ¹ ÎNïpêÕf¶ÕºÚˆX°(OÉ*`¥H'zst†Kj#1xȆçþäñDiY Âöùf>ö½M,”âÓÂò1ÒX„OáÅðãdB†ÐŒ«7X»eMš|_OKG\M©³â“ŒYá@P´!§›z%#{)â‘òÒ±ÑâÖÞ{­×ÞË%‹Šƒ¾z¤<Ðà£Æê bui§­—M2©— W“rÙ Ç(u8%Çd–ëG“Lƒ[‚ÙPo›f%#_9õÎ'UÏZ±eÒ©Ÿøæ¹Ïw!Á0G6k®Õ4Tpftúc×0àQd/ŽæéGῇò b¯Èç9ÆZí§…þCâ§?ÇjìÒ ½»s?ºqF& ˜i`×,Ûý>·5´mfXKÒÜeRš«!gµú! *ΜÂ/ÎÄø«ŒÇþ8`ð¨ ×tX³X¾`I&&NÚ=á6¿íï¾²På ±:ÙÒ©ZÄAüf®jÈ•ý¤‰sR ŸEòè¡ø{}ræŠj1M‚Ö¯°?åÌÝþ°Š¢žyaüÍÚÿSƒÀŸ endstream endobj 214 0 obj << /Length 2034 /Filter /FlateDecode >> stream xÚåXKã6¾Ï¯ðQF‘Ôƒ °‡d“Ìî"ÁNïa‘ÍA¶Õ¶0¶dè1=_Ÿ¯ªH[²5ÓÉÞ‹Zd±HÖë«*Z­bü©U®W¹5‘5ùj{z3µÛ¯dðÏ·¯”ã ÁN8¿yxõæû4]©8*âB­§G=ìV¿=”ç¡êÖ¡1&H¾Z‡I’oú¡<ëfº2¹t¼þõ᯾{¸Ü•ê4JóóÜ/Hg³¨H™Eqšˆ„‡ RÅ:hÏCÝ6$¶eÓmiÙ¬ÀM¼! «¦Ü«pWmƽãŸ_“DiîÙ‡±kzwCC_ðÆ}½VY€(O‡ªžm{:×bš" úvì¶•çY‡Úâ˜hf©‚ u/\øBžU¨ ²±°‡2‘J•HÒn†²nªŒž™`³ÆÏ2>—}/ÞÀd€\­Òí4©ØŽ¼`&U¤Qn.Ї‹¶Qi”(ãyÄæ¯ql›qóŸI´vtW—õP6ûÊKAZ›LÃåxt›q›½XB+ 8CÈ¥ÿ‰UZrèå§ñÓ¡ÆÙypÒ¶;6-ªlP}¤ËÉGDÞ°ù+Yêªm»oêߪ_tvUÖ+ÒùƒÅˆ¸SÉú•7új"¬3<¨¸,ë®mN4΃A>®Ó,(»š"qÉñÜ÷ß~óöû¾~û~É%I%@ƒs‰Sî±í*Aí±±½3êíUVãí÷oÛæ±Þ]µtUªÓÔ³F.X3é8§A¤L1¥‰Ó/Á’ÂÍÞÁ’6œêßÊɶyj¥EzƒO¾Šü'Á¦ì—Û/‡1åé|@6€W¸'ˆ¥uqè±¢b‘D:Ïç>™Â8Ñ…ƒ±¶Y ß|‚X¢úh¡• biah…ÈWá WO^0ŸNMTØ«ý~^4R™½C«.2A+]vA+ÝÅhe&h!¼r­Oø>ÍìÜ0ÿW•~÷ð¿ÏiÕ4V}¹j&±ºƒgsì—nÎud­º%]ÐÈ÷§ÄòH“8ø5–{'Ãûñ|f«´Ý,¥·¯m"%ë»V¾-4¨80ÜÒØ»³j˜*I#­³y`VŸÎÇz[G € Õd^ÅÓ3ñ0›Š'.\øŠIv2¹ÄÆ#”’8x`eÜJÝsDÉ9•NmXü˜"CÚ™øÀíEG¿< ÄϸG呲úHXyð-ŸæÒÐÄCzæ!}ã!¡H6€ Q¬«~à„º5C„g€«Ê3M$Å`™&%ÃÎ%ùæ¾ÒI3žv52‰‘©Ä(TEfn-Ɉø3ä8ÑØ’ Œ/í²* Þþô/ì‘ ªOƒpëMWvϲ"Žõy ƒsWõ’"Ä™ͯ?Ö3oK>m¯W9M|Ù!íå{U‹Ô¹©òÒ+3I€˜”Û-YÉíH=gO“KÛa@Ad’)E6TŸJðV¯e6ºvÜ–â+O¢LÝîèÍ5ÃP_>‰:[·RŸÊÕgé|„wìB`†K2¼\j4•Rºž ‰`ë:Ç2›F ¸£^FSøJØVŒsŠDT.Æ}ä7qƱ*Dù(®ÏG'Ì;Ô¢Ú‹_wõpU¯î@(—\ã+æjX{— ¶Ågœ¸ñÕŸ"`gÒÂ羽½vãQ¾>úâiüºÄ„Í%aL*X}¼æ›Òå¯ÍXw!:£Êg¨ƒãhQ™§úˆ:µ  êN¹ì9!ä.!€Âч)8Ñݳ1ˆ®f³TT‡ƒ³-s*!º;V 7%—ÄŽÃí¤ÑÈ9(gsAAbÙô®Œs’Kƒ¿µ4{Zt“ë:º×d…‚joáטÎ\ì´èÔØ‚´DaEK\oh <Žñ©hin#¢°hp"Þ‹hûÄFÄ0µ-»|Ú¸»…‹¬° ‡P&m¨ÉrŠKÑ"<åSÅå’Y„•d˜²m]ùüL‹\d±HM«£ÈÃ2ûBû  `'wýÃþtþKÓ.>» ³K³Ú-¾QM”ëô¾ âÔŮĢõº”=¯‡k¨W°!’O‘ÏbÙ&H$ÿQþì·]}$ÅnØŸ—æ-$Á¦ÒX‚ –Á¶s×î»òä’ð±þ°ö=¡Xy!'/&c§ñ‹Éø¿ÍÅN‚ïšK‹[Ÿ -ç ÁÝçRƒ½K ö&ì‰òÅÔ`/©aWc9T;z½ØBŠ`UÝþê”ä&2‰Y™¼ˆ znúÕ)J±Åþ)Í??Í)Óß¡üþprÀÂïP·×°¥~y‚ì×ì$+9oâ Fg®rù¥Ö£%é~¥h±@ãÞL™¹UQÙ˜!€@FWŸ¼ðÚç'ì Ýê»Ä4Ó®6@´3èôDèYY&÷7`’:Â\M½X’ÀVw>Ä›UeÅLÁ?åC·ÿ^åÚn¯a•ÃpþŠ*aðÆÿd‡3Ï"ží›ñ2C[ßí§´äÈz|ù“¼C:MÅ7TnÇ̳ÊF<ìãÔ¼äYÇNØ—<{sè¥ÿ/ÐÕWä>IZˆ÷0`ïáûÄ~ÞÈÄ…%F÷^Óy¥E6þÏxÍï¿Wg^Un®™zÍYX_íŒÞˆÉØUK†Ç‹4B¤ÿAÃ{î ol™ÌÎ%•ÏáІ»rp­ZRÈÈk%ý„+ÈÂ’ù¥ùÀYh‰Ã ÃÍyñ“j¿Ï>] endstream endobj 221 0 obj << /Length 2785 /Filter /FlateDecode >> stream xÚí]oÛ8ò½¿"À=¬ TZ‘õQàºi»Í¢M‹6íÝm·À*6 +K^InÚ¢?þf8%9tìâÒö“Ãñp8œo™„ðÇN~’¤"HEr2_ß 5´¹:¡Á«Ÿï1ƒç¢?ÂüéâÞO¤|¶—šèñÞ=pÑbpuÒîøêáùÏ]¤¦[~ÙOJNH±Ãl9Iɱä5%~„¸Þ#h†H#† “ÌœÞoœ¢ä8¼CQÊ»etg¢L¥DùÎçð¼ÇY¥,m»8|‚Svê”îtW Õý‡´Æ|]í¥eMèœGks‡g¬î–º3ZFeðYï#z)ŽÐ˜c9þ'Åæ4Ê( ä#=Å@“ï§É¾žècxÞÀs Ï[x^¼sz$‚Õ³¯³z æ7ù5|ü Ïë^ö@*áÑ®¹~¾M`S÷tüá> ‰ýú ®ö×oÁèž§ð,WšDã sœóí¯0Á9޸ Øë'xÊÃéÔˇOòHõaË¿•ÖÔòoÙOΞAœÕCîLW›N-€)BR/ž ·Š3ë9p©Cé÷aRãNd®Aó¼²;4j©{ƒ1ÅP3sp´–1/·æ«ue õÒ¥ß@fMmEØ‘˜C™c>NÁœŽÒy¹O¤IS­)0Õ§ii¬›¶ÝóW‡Ð‡ÔõÄ#¿xyqöâÜÙ 1É ’ÌôVýÖðáû­£B]oÿîÊæ29îL »ÎaÄÉN·à5o5/–hFpXº ´ª£ÖY@"«>æÉ±kúܶæ[yKÈ Uëb@Y–=áMYt5ZÇÕfk¶,‹JB&žÔ.-@ÍQå0£éx¢' µÌ·eG}àQhuàç…ùl7¹öðƒ-Ñ!#P;oTêà 6G©w¶tæ¾< X&܇ô©ç`Ó(<ÕGµ0Gi Ÿì×E‡*)÷eiÆÖ!÷Õš#…£¼©a^"$ÛC\éÀ.?†*ª¯”F7dïô` ÝØjES{4Õ>W+òTa€£eÏž%Ók À–`ƒM½ÞA°™BëfàB‹ëÀ0j” B ~ ì"Ú¦wÈèl?.?¹DåK°4mË<2u’ÿÈÚò {GØò¤e~‹9»¬™ËÔ$2#@ˆÎ©ÐAªvÕ´š€úªp›…±¡ ܘ1.ÌWÌNioÆ84„ËÖŒõ̮ӨóxdÆ8¡3ÄdÆ´:â.&3ֈƌy“#r°¸7ã>pkŽx¸Çš!W ’¡nØ#¾]ÊÆ» Zϵñš~g/¦§w—.P¸|¥=cÖIu†Ü[gð¡Ip´=‡Ü(IÖg¨°MO>²g\¥kC~´-ãhÙ³ÖͰ" q¯-¸®my²ÇPµØ“VÝR!”,Ê&†1˜²èMÍäëÍ8·fœ_¶u¹í”ßÕ¥‚`®œæÌ"„éÿù›–èÎ^Z‰®Ôn ЉT²©SÓÁ;â&¸lÁ‹§ã—‚3 ó[ýßJz··Ç–a­BH~,Ö¦jÔ€þ†q¾F¿V‚›¦u£E ¨z‡ÖX¦Öý6H“ÎLaªšbNêšB² žĆ§Üô²``³ý«¼YŒj&ž2òØ€3ðIU©>1¬OMu'EöM™”ŠVMm=£Îsh§ƒ„Εhl…aw\Ù`¯mÛªþmfIsv#íÇä,ñ¬ ëòQKŸa* ƽªK3%ƒ£ëú&Q}ª£NG¤F«[³AQ-ÔGeàea¡N”Øy‰¾²çgÚ6"ãAÆÄDåQÜB SÒÔ0n욀<“ÃýA2JõXÁpá4âÛˆ5Š…Z„¯rûKƒir3NYÕ€0+UuÕ­t¨+‚аMê(†¤I°ÞÝ—Ümà|¢ \ô: c€…œ FV»S¾.=ÜÔŽ>øßò“Ù‰ïQˆq$ޏHf[rTÐ9{“‘Qí´xçucDHûk{Zœ¸OËÂxܼÜßx‡Œupìî32~\ð9¦ÓZvÍ!üƆÝF•9„í» »Ñ÷·"ÿãa—ã.8ý=qWƒË;&ìJ|™MÃ.PŸ†]˜6>!;¡ 7BoÊúþ ½È÷¸aˆ€›¡WêßoífŠß#ï_0ò²ï¡÷«Bï÷Èû—ˆ¼|èAwà7;§xt<>ûi]µÅB7ôÛ}s3qÄyI á.Î9õ‘®þÜö(¦£bIŸæ™î†Ât(ØôŒ^qí„LŠ£µ¨ÍO–õ‹ yêã\)sedFîFaÛÔ¤ÿBo æwÎÿc»² endstream endobj 224 0 obj << /Length 1931 /Filter /FlateDecode >> stream xÚÍYmoÛ6þž_a`æ+RÔ[~芤ȰC–`ÖS%Ú&K†$·É¿ß¢^"×j÷‚!@Ì—ãñøÜÝãÍW.üñU(Vaä±È WéþÂÕ£õvE»·ÜÈ9 è $¿¿¿xqíû+î²Øùê~3TuŸ­~[¿Ù%‡VÕ—Žçykÿå¥#¥¿¾)/E´þˆÿª?órK³0®—|½Ïò÷.÷.¹ -Äåï÷?\\Ý[;|á3_z [L-s}I–;×ß‘]޳©êý±H^¡/®1Z17†ôšÛ‡w$3Å.“ñÊáã>'чFœ¯Ûià. ìDy™åiÒªŒºpòÉè‡ú¹ ˜”Á+<Á\aMm+ÒšVûñÚR«"isí!3¢êºªvéa¸¾ÙÌšDŒñ3¢N(oH½‹¢+Ç8Œ2 ‰5R^h¬ƒFZ$M“§ÔÀÖ…¾Ê:O27Îã|dlÁͶª¡1„íGŒ_3Hha;@¿…à7£¢lò „APÆeþúè<'‚£(Ñ»x¾Êý`GÕP_¯œ;f YÐÃ{}óãŸ=¨Ï$àlÄ£µIö‡Bï(pGŸvX}Wœ€5ŽXØ#v Vμx+î&h# +Ž™‹IâT‡)ÎL5pÂs™pÅ8ZÕ–]H±'ÇHÂD> #œ¹â(Nà(o„£7Àq´3 ‚17€Ù±`>0I$ ù|cÉ'Ë·yÛÌsDk¿ù)òá’… 5L©ŸU ñzÈ3‡‡Cñp„® 4J‡pÈâØø$š`§ùjCŸt,jƒ àSöJš|[â Ӥ̌Ð@67ißækœ9Ô*Í›¼*)2‚E‘FRçín¯Z 9oø! &®øÉºâP59ĤŸl6ªVe A4Q2Øõf[VµŽãb¡ F†IL7ò+©ƒ™p,²4~ê ó¸‡xNiÁQEÖPAÕâ;¢l7 r 륋Nå.i!EEGHÙdÊNZi,ÝizÕµjxE¯a—á>°¢wî´H| £iéiÁºiûU…Zê [ë Rm“¿é PAƒêÞ38¤=rò ŒO Ï@O{>éœÐ°n1¢E§Ü‚Ûwvlk•Pí¤$åÈà ÿ˜|쯜oŒ¥Äƒc¢xÄ[èÏxäÆz$׸:iÒ¨3Ž˜ø„¦Ã±·jb¢Ö¦mü´Ë #UöÌE°%E§Ž WLRÃÉñê^©qax¥ö0鱯Xxš%c,.yØñᛇ»»Û×ï®æËÁ€  ¦d§(nоÎüœö faOÞÚ›¨¶³ze²7ãP>™};Éaÿ¤‹s ß7Ö<Ò§!UlÎX!"(£¼EXx"†Ú ƒAÌ®cOH}‰P x´ç/ì:Ç–¿þcΡ\·­)ü圜3 e¿‘ù–#.ø9«VYŒÅi¥þD©f ø4‰ ·ÕæÉÌìÌ{Ga…Ç«ÊÂŒm:Óìš>UÉp*(ýàY-méÂÒÐb¶ír;ë+0Ÿp-æe;›œ ¡þf¶ˆr|É"R¢Œ^†ê$…47ÔP+ŒFi6nŸ}ÆT5$™“ðZd¿I‹“]ô(™í´ä|‚´½QZ a»«Ž Ö8N£ ’¶ªç„Þ]NÅ3Ì2FÒÍ!¹‹HF#$alIµK¬ÅÔµf“f ãH|# ô0âlEË€Lœ¹2ãð n-¨Ûº:œB•Ûv7¦0xëÛ—ßΣ)cÆEð94¥0A&1W©Àÿ†²jšÐ5¯Ô¼”Ä{.N¨„bšzÚþñÊê8¬+`MT[é¶A:D¤qEZñ) Í)/1÷j]Û˜ZóQ™“x²Ox]¼wJϼp©O/ŒÙêtn_Ø@.ų‹ØÒâ ‘pÐQÄžôlÄŽŽe/Ó)b¦¶`=6ÿ×`) –z> stream xÚÕYYäD~Ÿ_Q.©mœ™>‘xf`YiA8Üå¬.k}>¦·û×oDF¤¯rÑ5PKí<"øâÎ;þÄ.–»8Q^¢âÝ¡zã›ÑöqG÷_¿Lç¡;£üâþÍ'_…áNø^ê§bwœouŸï~q¾Üѽ\÷¡-ô/±æ6Œ½hç å‰PЪï‡ó¹Õ]‡K…“•%6¤SÁPö¨yøÐÔÝÖ̹pú“&2b\·æ™6/ºCƒÈ¸`*§ñ¢^­íúv8ôCk6lj®XÐEéž=îöd$€d%¬%.ȸÌfâÅ ‹ÕýqçƒnšNßÏWûD9 ªC9úò¥Ûgêšá\"3qL—‡oYÔ†h>ŠÞ÷DÝ…ÐÚ»Âá (0™õ¼\g7›ðîÈ«.sêœÛ¨#Óe¼Å‰ÈA†¹mñ!}CÝ©!/ѵ3Ù~ܪÓšå šÙùŒzîèŒm„äX¹ªKIšêœ±¨•Ûw£Ü܇B?ýò­ä|m’‚Í„À–YöíÿÙ:@ÄžH„%úmKÜ õ„\iÁÛ¢;—²¢bÀ? ÂE®iàa6iG—æAseÑõÆŒ°ƒJƒ_Ò/ Ã ÆR×Ï4Œö®-)À½!e4t=êN§Ôå3µŒ͈¦|w©Ê0gÕšxiؽc»·ÝñÔ´¹?Í÷åÕ?v~¼€1:øV¨ˆÐA•œ³Ä¢±("µ¶ÒÝ¡ëIÕ9± º,hé;’3Å!+½½ûÒùƺÒt®(RÅ^:)Ó¤q uR´ÉÒ|à‹n:™Ä;S7=Mtg›> ÷Èb`m­ûÎ ¾'|±¤ú³ÕOÉ­ø€aÓáRî åÓô¡)‡ªî¨ÃfÝ Âì*¾Â¾H…'EúûÐÁœs­éDÐŒ®è Š4lt¨P ¤;ºE5Ák)²ÖoÝÏ• Wja×o™eo9CÅç;*þ„Šº‚JÁ™Áë ÌŽ+ø$E¦À½~ÌæxødK ãáGNÞ0j .¶aÛhNSUGLŸÞè?¯\œ±t´ùÜסû6HÄAš|ñ¦BøÂK_e]€–—Hæ3ýãˆãmÆ‘ú^,å*L¸möt5¢û›^<´~7X§18ÇPOYƒcX®êQE'o=tH7óÝ¡ñ†HÒfhqðØ´¢‹¿ú¡OÖœ:=oøpHÅÆ\T×Åär´cÃèHe²ºƒmÅ­¡ö÷1Ôþ>º¿#ñ»nW”ºî?>T6œ%]Š–µ¬k¬¯7Þïûñ~°Kôнr+ZùyÎçuM¥éB³(iiø{šþôE_¦D¼Z·8ºõPAˆ‚ò™øt+{A>!¶šúþóo¿~·™@š#n‰¹.õU ´@‡Á±Rzºžn»~ê”ÚRd¬0œ¢`¢yu‰G x¨GùÌåØÈAö (¿B„òï¡´Ù ääD(9Y\Lw|A>‘–Úd¼ÓR‚f®¡ï(AÓ±ÄJ„„Bœ&Yˆ‰â?B‚?/%8ÔˆV÷¯ô|Í#å¥iòº…y · 1²enD¢±¹[‰É[GãÆ$ׄd’‘?™ddŠ­S6ù~žkè;¡¯L(Àédª‘˜L5ºVro‰œBõRÊ@äß(’% ÛИÌ*ðÉ3.¦­YYÒR[ªaÉ(¸™khf4+¼‚¡°¶†,‚ªfŠ—Û¾Ó‰!vc]pƒ4"–F5J£*ê¢ÊÊÛâû[«5ãÝ.ôì»eó>ÔÆWD”2ÍÀ”¸ ^Ú¼¯Ó=MÒkr脬~¼ýÉà_SžpÖ:wˬ}Ô^þ8]¸‰Ç¬ë†Ê>àË× ¢±95db³„º;d}¯ÇÃÿÈlŒÌ‚(éæVž#ϽîzdNØ~)AK‰etËS‰üã§’LÎ_™Üû’©uûÐbef§F«0LèÐ<¯1/±y‡×AÊ¡ì;Þ÷H›vÁ¬Î=¯ihä ަS¼èÕž6±‡tÃõ±¡Ö‹dt¥ÖS©ÅñëO,k½4àl™Œ¾vÆ”Øè¸:˜â_çøœáO’düå ZTÙ§Á¬²‚ά†…×°‘¼VÙ»±ðB¹”êuîb•.¸KÈ®“ ºeyŸ×Êû4žxƒÅ†·$¸ZÞ‹Dy¾J_Gv¿ ”$˜—›p€bc4`¦W_=|(>ý裎`1Å·Š/Vø®ª~øÐ U?h®©ú‘¨ BlqÃÌ?¶í34G[Ë Ê@ùˆIŸ™†·`u‚Öf¯d÷¿y1ù‹<îËOÃeÞxcñ¿áùîGϧÿw>Ý>{èn fïÌ|[‚WAK’ ‘îœÑ‚¼€¹ja^_M†&ÄüÍ„"nsâÉÉ{ Îúæ³>¯ÆƒJgø«Ìq(×¹vßP™ó\~jEâ³=m³T"Â1ër¿ÛÂS„¶˜ÙVQžŠF÷çnþ&%„„ãËýÕ ˆœžŒâ•ô¿˜’Ê¢ÎèÅäuÁßã¯:­¶/[d`ÅeÃÄy.GhûKƒ…ü “1~ûêÜ*öÛæå“ŸŠ:o^,›ø+áÿTQ endstream endobj 234 0 obj << /Length 2205 /Filter /FlateDecode >> stream xÚ­YëÛ6ÿž¿Âè—Ø¸H%êáý°·Ùô¶Hvƒ¬ƒèP­MÛº³%‡’öñßw†3¤%YûèµSÃáÌp¿!¹bÀ?1IÃIšE~¥“åþM`¨z3¡Á—ŸÞæó€Ñëpþsñæûq<?æb²XwE-V“ߦçÛüÐ(=ó¢(šÆ?Ì<)ãée9 ³éþWý¯(74 ÄtÚÎÄt¿*þˆhæ…YÜ¡œýgñó›‹…³#c?–Ñ+¶Ü§–'CËÃÄbI–{»wd—çÝçº3k¯©~D[¾ÿ„Ý¥"€ñ|êÌÊÏg‹[ß7žŒüØ<ù"ÄüE­ ­– éºGmàã9ÍËM*­+öä^ÕõÌÓ|£j¢¬uµ§Qݬ€“Ö6Ñš­¢AQ®ŠeÞ( ~–;ÅÆöÜáÅ©ŸL¼0ð£0bTÎ#UÛÚfÔièGIô¢/„ôS`{Ƥƒö±ÖàÚ Ä V-3 6(ÿ¿ ÚoÝ·jw³›£iÍͶÂ<¾'í[0Sa`v08 cq"ÉL9=h˺²´Æ¥b–Z5 ¦Ýk­¿sÖß)]UùÂÄØLUòr[–Ù´Ýãÿ·X’0ÉzÎÑèê€3ºØlqÐðÜû¢ntqÛ6NÎb–a ïë#®®½_f¤¹Ö¹ÑÕ` <²íéø¦ç!ÿþò ×ütu}³¸<¿Û1dÚ\JØsêGGmaëA=ͪ¼iÙ¸‚çÔzPEÆÄ{ƒ_DØä·’PÖ±B3çµàDæ#{Ds «omŽùóŽ>=aS9Â8†ak™–yÍvU,Ô¤“65£ýQOŽ9åýŇ™bj<úõ#ÆkAò®¾~ºøryNê>àôõ—Ogµ…Ýp¬-8QšTͶ[‚u·^Áæj€ ãf~xmÐÎ[­U¹dw•ùžýõãXd™ŸIÉß}7 BÌäE/³„½ –Åüo”h+'&«3S¿ûoQ&hè-_l«¶†äæýÖ ¶™7•î¯}7ºöª_fݘJH£Mmj‹sê|‰k¶Œ÷}í]µ²æ¨§—ûQå+׆yËuÑpNsy›²'é÷1¯ 1ô—ÖíÿE ? SËA~ðôhœî¹£gV©6ùKy£^ýŒi&ä÷I›¥+µÄ*9ÆZ=ðÖKu ÷Q¸z;溛ÇNÈ*–ÔÖÂm{Z©²jÔ°Uíóiô¹~$J[­ÅÛW—ïÍõ§ ZuñëçgWg¦€/¯¯þ,*†êˆÛ£' üø9|Þ×QÙ—±K‚w£büäÈá]ü-RnŸ”¥˜ýaó¦]Ìð¾ÊƒDM<ÆìÐ…<ä‡ÓmÁ?víšÙ¬¯¡ï”«\ój<ôÀ²ö)6:ßsÕ$‰/RÙoçùrYécÝ8ÀUºÉ-hèÙ4†§ó œGœc®ŠcS`ϧ„ð„–Ž› ,H2nˆ–dƒÓ‰ wWí~• šÅpTRcz’ÐO§Ç‡;F$ðŽÁŠ V "°HW£§Á4T²"Ê® ëõ˜.8‡Yæ $‘Š5@Óà ]ǰ›%:K) GÔÅ0Ä"íÇРÛaœ¼dŽ]Ù“"ˆRÜã&&2k¹lÑÝÈr¿U¥ºÃS ¶¤›—;ñŠÈˆ”j·ªi®iuItsà6¤Šܤˆˆ©éø ‘²Iál¸wC¢“ÞÁ,VXšseR?³0™EÖ$úàkNw¾V˪\ywLßæ5 rú¹›Åñ4ßµ<}¿-\çÌŽ§´úI=Ðp qGÝmr̈O&{ejå¹7¯ë†æÉ`ÌYëñ¢PlêHS!\ <š±ÊHýôÖæT Ôé†8ì j!­0ɃdÆ`»àÙÊ2[í+k'Kæ#µƒ:°vLAHpj âÀG"èÞûÁYü¿Õ-ßmgïF>/µ:^ ‹æô‹bùú%~†/´¯®f§à‡‚Ÿ¿ ®Ä.ÌpkTeS˜ZIÓçp=It0R€QÛ0‚Úç0òã8}]ç±CþªÜ=’t‡yµÕËn½(ô¤{8ÑÃ’CO[xW‰}Ÿ¡÷ì—AL~ÆÛº;Ew#•Ý«ÕCQcm ]Ž´“mhÞµdÂDdYD`'# ƒçƒ> stream xÚ­ÙŽÛFòÝ_¡–†½ì‹‡±ö@d$@2É>$Â[a‰”IÊcÿýVu5O‘’&›`ú`wÝg_ðËW‘XE±d±ŒV›ã«ÀîV»M~øúwç|8èNþëñÕßÞi½âK‚„¯·CPÙêïßûôÔ˜jíK)=ýfí+¥½oеˆ½ø§|Ÿ;ú ›‘w^sï˜å¿\®}pZèõoÿyõÕcG‡ši%ï$º=}ƒò8d‰RÀ@È­ˆúǽÚé•§&/ ¤®…ÃkZ³0€É^ð?¸3#Ð\±vÜ™¦Êw;SÕ¹t%X(;°ιià¼H¼c¹ÖÜËÌ Ó8j/1¶T(l‡(·(‚Ñö0FüDœ¡lagPÆv;‡LI&Þ̦q(в!¬§*·ÊvËÔ.>-Vëp²,FrXÁ"f*T+ŸKÆ5'ðu“YZep6мòܜΠð§#mu4#@s©’©“øºC†a{É ðk³=hžoiül­÷ì*ŸiöŒÛiÇ2ì4%ï‹wŸÝ¹½Ž+Z¤4lÊóé`D‡A@ªV4<ŒXÀµ јVpC$g>œÓMËŠFЂ5‚„„¼à^^lËê˜Zs¶›ÔMžHƒÄS“æ…ÉÚO9¶ój:jwÒG*ç547Ÿò†¾‚êš³CŽ\áˆÊ¶“SUîªôÈ,à&èÀ&è#x H¢ëªoðû “ÎÒM“\ëàÜ« Â'†’ Þ9UùÑTsƒZúª)…1KxG×Z¹µç´‚=¡<¦ï×$s¤b†·0a:ºÓeaN'ÀàSBVç™ñŸ¬ÿù8§•9‘>«ÆùŸ ˜€0ò¿½4Iq8A#¢YfêM•;ãÉh¯=^›M«µaü€‚Çj{a¢lüf¾±”ĸ°|¼3Œèí}`&¢OÑXN~t$Yú@µ4ùå{›:ÝÆEÉØû t§°Õt瘇Ü4áHqÁ8ZÎHíéôO¶Q=„pùØ*‚ü=WVí磩ÀÌH›* TCm¦ÕÎô&¢½t‹Iz.H…â¶w…¥- µœ&ËÁÑŸic 1¢<@Ù>?PpÖj*w–NÖ§tcjGE9E‰ÅîX1\“Ù8'Úp¡®„ ©% ur%(S@öq2 µ6RÊXÙHy†2š5å® ê°zÎ!ÂŒ’ž Ÿ¸(ûŽFšoéówç®úÁmóicN ÍÁåfù@!ïr–?8g Šš.ÍišÉþÄBƒPô  üôÐÒáñ¿úS8úùOáèéZ Ì€äRdsà|%bòI|õý*}ž‡e8(ét ¼ÿîMa\ÀšÍˆ Ôò†Ój&ƒq¥£%nÁ¨g…¡B&¢ðý^—)$øž©?¬ß1”Ÿos¹ ¨D|CÅc@ެ¼vEYÙèƒzùf»BÅ Þ,iZ ¦âŽŠy_“ÑQrÃIg{ªLÝE|Ü(¦ûº;¸8©»7åñˆRƒ<¢½„4D:XÙH7KmÌ"®oØá…降šÝœEI|Ó°õšåh쥢Ä{—CÆ„ŒQÕa´e=œ£:¦\`H€c)q#Ô"þ;LNÊ1B&4ÙK«UaÌâ$%-W˜íSÛrçØÈ€*q‡ù–Ïùá@³ÌÖ…pÓjo4¶Ü< §êµ‚ v÷"v5"~>Á¦Kq°Ô¾'=9)µÂíuªº¹@G“Ö‘Ó`l¥Î0¥$uCÓK·$š¹›öÈb‡%t@PoÔ7u¥ñ™xãR úÎcÐú;"çZÿ˜IÞ]~ã ›Œ²¶!çzû ¦=|P=XtùÚ6;Ð)ôÕílÄLˆä¾¶#’ªo;ÜÃÂÙÖmˆ3¥¡rš§‡ åšŽØ6vƒÚgÅPЈ$«¸kièáH·Å˜šf®°]µMŒ‘×î!À10ŸøPFÛh15}@v¶\Y¡¹BOî­y§C·ÛõžªOdßõö–²ŒvœÊttÔfd»½éÖd’‡pÆ\LŒyÀ¬ÜÓ£7µwÌJ'ß¼À“yp€¶46­M^."S¬ ÝêßuÒ&å éJDòv˜\ a‰EXݱMIšN{þIø8G³e•„&)Žâ±slï¸<)çâ†h?+ÅôÜè‚´ŽïLæb gˆˆ 2Ó¡[<§®«š(]ð³Æ§Iï©L›zN*Á˜—/ä˜Éñ,&?ù™ÿë×h !Èûïoß’–-~zåíÛ/Û+³&# ùbzëõîT> stream xÚÝZmܶþî_±u¾ì5^V$%QJc£M.úžë …¼âÞ)ÑJkI›³ûë;ÃJ”¬ó޹Η€O"©ápÞçáÊMÿäÆ¨É´È´ÙìO"7ÚÝlèáo¿{"yÝî‚•_\?ùÕ×I²‘‘È£\n®!©ëróíöËÛâ4Øîj§µÞ&Ÿ]íâ8Ù¾l®T¶ý ÿk¬šš…A³=_Éí±¬¾‹¤¾Ú©,‚Õ*½úþú÷O¾ºùHT"’X?i¿ú]ÎÓsE"Û©`DóŸ|’\íÒL%ÛÏŸ?G&€àNj!“`^§&Ù~òØ• <=þâ ·Ü–íM?ûFÒG¿¡é?T¥§„þT ý=T5O<-‹¡Oyº§¿ýmÛ9âËp[ðWöÍÉî[þÂo©R¡#ÞòÓO?î¢$Ú~½N¼¬Ûñ‡®=®²¢ž"ñ¥Æñpˆr'aÇ$¦ÿX5%iXü“ŇxÛž†ªmz&¶PB.b ™Ý«µe"¢Ü/)`£BJ %õHçéÜUuM|¾BÃÛZziÑ(¥Ú®«ÊÒ64^ÖvÍsгw}}ï®Ò¯Aµ"½¢î[’NoᔸS†–Î${RŒA%ű=;?è½=ðxYV(ߢ¦÷ª9´Ý±À!8‹u•ó60{…„Þ® 2N„ÒùI¦$ñHHs誟ª¢®ßz>À©“³mö‹Mi±?V`(T(£çÄ•+…–\²qÁØ-ðp«ÇÉ•H2Ïis>¢å¯(Ž…Nc¿ðD&Ñ¡$ûņûöx*ºªG¦ÝÛÏ€Œ8n¬3˜Ķ.{ÿ–D@ÈUM? šU¤1HaRA±ª:γ5:FÄéäݽTâ‹TÆ;õTvq‰DêY<Ýýé©¥"MÍÈÓ_>P>H%©üý£Pùê£PyùQ¨üë2°IÉÑ'3BÊEX‰†l ¿É¶·¶(]âÀÑ“‹*Eœ½?ªHe„6úaލ¢Ñc+fà;©cŠÊضºœÙ¶=sul –èÜüÓ×fÛ¿=b€à¯êUÁ<e÷ùç¿|ñb=­„IÆsì æ¯8qÈ(:F®o+jÚDÁ<¨9–2Žmý ë —ev:É@²¶·$[?ÓÓLQû€’vcf[Óñ÷)W 4C€ÛðL{ ‚?uU N ¼–ÖË}O”`ú–„‹Ïþ#3qõ¾ýVj". 4ÓŽJ²k›r¬ 1rÖ\>¾´(霖ShÓr¡q[pyi|/¸±Ý±j YÒ¥™ÇÙ$ ú½s'[Óz.²) ïq»Û¢+ ë|îÎ#¡òœÝG¹[冓ܚÝ%P«Aú›U—E:Õ?%æ$: 8ò”„‰˜QÊ¢+i¸=§óÀû¯V/2ÎDžÊ‡8¥Z··ª~¨öXyàŽeEv¼í]f3çñÐÖ`®˜)Y)˜ô!ÅdÉÜB‚*æ3âpœÇÉ@›Úk3¾¬MÍÚŒ/hóšü×ú=„¹{NÙh¸=Ú3” RT¹ç,åˆYp ³!t†þ籿ÿ•ë: ¢î;êÄ>Pð¨;Þªk©yÒ:,Î4÷ÝG¥ŸÏ|ú9Ð8;‹ï:¬Ïk?«íƒeW\öŠûÄOS¾Šùøz¸ÈߣìŸ;èý*‹€jÐ~h-ç ÖÑ¢s‡ïéÜu Õy~¡CID”ª9Æ)}ƒAú9¶S‹VÒ ëu5k~=V¡Ø…6Ì5Ÿ{ÿIJ4׫¦±Ž/ ² 0ÅQäPå¶v2%Ô…Y<« ǶsQ[ƒ>ÆÚ:tˆû{?©3a²ëØíºânW•‰t‚&XÝ2Sf+X1¶ï©ç“\˜øÐâ%ºº@‹É#¨¨ÂË}ýIô¯÷ô'H&¿Ð  ¡Qc…+vö }ðÒšU~¡w•úa]·š°&ìQsE xÏÔ ær MMx…”‹¦{ÑŽ`çùÓ„Ÿ¢>[3»X¥Û‚×µW€YêcßҋžûV¶ÃUµ)• =áï—ƒœ:Ð=¬„t»°{;¶ífqˆ ‡wLó_ a¸ö„É¢«¦`\uäàˆ0ò]%Ö½èú ¸TüíZrPl‰ãxšúíU÷Lä’ þ ¤§5„AJÜcÉÌMI0Ž -¸Q”’[ÐPÅ<|\_,É“|:6ª¼%I–:÷ž>¨[WÁ#$V‚ž‘™l.ý ÓA·ö¨ùÂǶ.3¹»­Ù£…SvMl´¯œ<ÞQFPöën@‚þ’ަŠa­³™`0æÝ®^%Zd~¯9¤ù˜|É´ÐYµ"ÚÑŸ³†#ÎnÜÖ£a8TÏòí'¡zˆØA¼éñªWEïP±+h| ¼«z»šœt¦„4æaÉi\6–Õ¾|TØÌÊÝÇš24¸¿K6@ÔY«ç¦ööÖó¢aL2 *ŽÝ#eº"p u–¿-N§ºrI k—–ëz-IÌïL´^ι™e5“O¸ºMo¯ñ–¡¥Õ½µ´ÆyšK†À]œ=áÅVµÇÓ©Œî$q˜4Á„ﱊ|êEóöß{ˆ9Ǧ_ÄñâgºouÎÒÛ¯XhHmëw‡d‚5.¢yˆý-ÿdK¢¢h+…ÂÜœD[É¡ö#RD°Ì(X."»“+?û‚é)¦môü“Šçô”ÿeÛëñçjø:#ràÏÔ¾ý>Ú”0 {ÂÁ³Í[tC7©7ß<ù+ý”-¼}€Ï³ÔlÒºÄùõƒÂk²4ÝaD„‘ë ^ô–/ŠÑ]ã!ûm)+Aõ.¬‹ýë•aåüóŒA z~É;À‹ý­ŒCu=©Šç*ãÃîaK~å ¬ep6&pºõ–*”†pœÇÕ÷°U㲿#ûØô"0¨C7h3™^Œ==r4µØ3nâ RG¾ü]É\±\vÆ3 ¨r ‡u ñÃ)üù"w¬±1ž‘RZ$‰\Â)!-‰PD:ƒ€¶ Âü "¥ô endstream endobj 250 0 obj << /Length 2370 /Filter /FlateDecode >> stream xÚµYmÛ¸þž_±¸|8Y±|%m»îÚ^‘~)ì·^ÑSlz-Ô–\IN²E|g8#YòÒûÖëˆé!9Ÿ™yH«+ ÿÔU¦¯²ÜˆÜdW«ý;¤íý5>ýùâq L&#¼{÷›ŸÒôJIQÈB]Ým¦ªîÖW[üa[zß.cÌ"½Y&Ö¦‹õRç‹/ø_óϪ¾§^f‹ãR-öëêg©Ì2ѹ„Ñ:[þýî/ïþt7Ú‘êT¤Ö¼ÐèaôcËݹåÚ ™Z¶¬rYº;¬–ra„‰Jå¢àO˜Ë-S Ã2.”>1h1¬ž(#TªHáY¡e…Vä°E‡sÍ ×"«Ü\¥E•çÞÆR‘å´@Y¯É“ýÖcÃ.VMðtï飣îfC½<Ì,ÀÛvçy™S”Q"Ï X(¬°/뇬šÝq_w:fP– 9Ž.[Ö_}Á³+Â×ÏhÌCl¹DËB®àm±ã~`Ç)¡‡ ™Ÿš(UÏcìG©b?'Á*v$?²f-4ÏÔBG ¤5Û¡¤ÚÎ4ë˜æ=ÂðL#ô ÐRŒš‹¡¤¦˜ižÃè E£IVÍÚ4ÁüÐC+`éLõ“pâ=>ê3@5Çþ€!Úó×ͬßàöûe¢Š0hMƒ~‰ËgŒ R!è7¬-)i¢) ¦°SEQ$jGyBî÷4íkµÛ‘òÏà€d…Æ9‘)È:…Ѥáǰ3 QúSµóJWßÍLûŽ„!õê¡£þ_Çr3—Íg‘}‡þÕY¾ØV÷[ßõô¥ü NîÐݰ ¢ôé[_¯X‚›Í¾ÇÀûŠÿy<Ù ƒ>0øÝš¾lÚfó‹¶™ÈÒ,– T4dÂæã¯ úž6“XÚÖw‡`[S¯C!˜ƒàO domÕ<º.Zè„ÓÙk²U¡GˆTàJ«$e+p:¶&QU¯½_Sûrö*´He>¨ûOlE8Ò“}¸¨3Á*BD¯MÁLõ¤^hji†!·ÑˆÓY_n\9/j6â´Ò‹Œ [Du×Ð4’€2J0Ø*1,± ÕqïÛjÅç¹<7éüü§2ƒxFŸ%§ÅþÍ´îu”Zˆ pæû²ªg:w )§ÂÆo[âo»Ää|÷e™:ØÐ‘W…,&ÂV”…µóûW\ICèniul7°DKÍ-¸ê›ÃºZ†K•\È­NØ"&·šÿ)¹fÐΦÉŒ9  «@ã€j„Ó³ªÆ³ 6žGë9öÛ> ´Sdo%g±Âûþ½á ùþZ*…Öïno)å"‡{áœÛÛßst(–Óüð¹'õC>oÛ¦¥æi99ü¹&é'¿+ûêËÅY@sÆ¿·$ÓÅ_å ;îLŸ{ÃFèElÂè äçžP/sЦ7¹b6ë¢+¦V?:tΪOlÔ<Þ¨Ñoßiþ+:T5#UŒ… ÄR”ÂQ²Ìíýª ”~= ä%iД.Aoy8쪰 èkêݯGwQüçP¶ôj„k4{ž Ò¾Zw@BÊ–v3R®SÞçËE‡\8ËC ƒ°)+-Эñ]Ê“¤oðÓ,ŽÝ ØrÃë=Ü ÖÔ¿iÚ=É7˜ØQ4Ž,Û{ ´ƒ«P׿X¤Kàùn¤èÀÔbÜZ ›Ž°ËÄdîÂq¢æ½/ënX¿äåÊMxÌgZ —3=Çúä`¦OЈ_›:4€Ÿ¶$8Ý&êhËúO.ŒÞ¬â¨{ϳ˜à#–ø Þv4tzðr‹ã6Í! „O*‡—+°¥Á‡Ö¯<¹ßŒw²ÐS’ [SÇ(ÑÏP<¹ù>”À¡Žw Fìn¨›Á}Á(B‹›æê>=dNv‰¥°¥û:Žå3Áá.á:t þר ¹:çøÄÀ8{B¹Vó´Îpß­y&tæÎ(û `yÂBÜRX¢l–Ø1„u~Ý6!€ ƒ)WõUSs7ÈW½ãá¯Ýÿ”­É endstream endobj 254 0 obj << /Length 1479 /Filter /FlateDecode >> stream xÚÕXÝoÛ6Ï_a´£‘ŠEêÃÁ2`Ö¡{Ø€"oë°É6] •DC”Ófýîx¤m9òìuýZ 4Çã‘÷©»#&1ü“<™ä…ä…Ì'‹æ*vÜîõ„ˆ—?] /`t ùýÝÕ×ÏÓt"b>‹gbr·:¼ên9ùý°.7½î¦‘”’¥7ÓH©”½h§IÁîñ?ó¦j_Ó.0s¶ Ö,«W±Ó()bNŠéïw?_ýx·³#MRž*y¡ÑAú±åÙ¡å"ŽyögŠ„¸,ò#§^žIý9_Odþ½ý¦^~ÊÔçÔéÌ«ñZQ§S¯¸zßP¨“úÇFgþ¬¯'R¯>LêÕH=4s{í×××`oœÆìyUûÛž4eûðǬjZ+žsY­Vº³´Xu¦ñÔø©ä j<ƒ0º`˜D"ç©ôÃÄVí.J°~툈NÛµ©—Ä¿Ÿ¦)+kœ^ æ)m•›M]iKÜÖàè|K;¦­ˆ†`k:,`œ:æÂ4›²£! K¬J×KQÕƒªnù iÉVfÛõk¿@ñU¿&é²…»—cUa«w$$ÙÇ63¶ê+ƒò½]»ð9ÀÅ"í#!™Êó¼ÅÖ´öHh®d.¿[ÙTÏXêU¹­{¯ ÕΔ”U\sÀ!¹déÎð1^¬Ð‹œ=8ˆ²Å¸€ø¤tÐ¥§íÞÐŽ%§õ¢Z=ÐNI-„À­Ý©m]ûs{?Pª¬­¡ÆYÎäì󅫪õ õ´K¯*V;D¥ÉÂ51Ѳ<¤Ì2ô*G¯F_”Xpn‰I"²Â‚Ò9{ zk©¢œ3¾\6—uú †èJeÂRÐG}¸ûjDʳ\™ÆtþÚ¾j´…œe±bw.»`”Iã|G‰?GuÊ—É,Ü×nü´ l‚ð[áv#£ì)™¤7„]"èÎðÃÞä (ì‚xÑ “Ðö MŒù›Äà0ôoàWñB{—nª LŒ…ŸùÂwb†Øh6Q¾Žâý l ôaAº¬[µŽr^KÅ0§ªî©Ù ©]uþ+f‡íØ•ßå‰ô @ª8aeØì ýÆ@å,¨¶Ø1«DqÒtrøIŒTüÀ>ì J±_ %Ð}ñàIx¿€FtȲß1©ö Ü ´\§ÔÒ¦~W.zרÝ׫€ê´×ßõ7c%üxŒ\^Å™Ù.F87ÚŇíâs ºO÷ÆŸõ‘óQÞ8â=9_Âç²P\ úÿo˜ßaàäËÀÀ¿Î­î¨%cÿK¨Žô½,å©ÈÃ`¼IN …8ßÉ`çk ‚‹Y±»(¿à¢ÎÛVÎ羯J –X0zFtÌ žd{[£ñYøGŠim4jo’ ¤ž‘i …Jq!†qSHægÚ‹žä*ïÊ,ºU˜‚¶š×!5ÆCƒ );*ã-NW Ö•íkOêw0ÂR´QWo|ªqå!Z– !šàJî‚׌ëx“h, Té{…êð 9P{gÉÈŽîZ6¸³=¯á©Ê ž¢^%íCCëF—!H%> ÂB1¸²}Ùõc㊾@¤m-³Á·&røØ 1èQ͘Õ3Ž„·Ú=Ú2Ä8šˆWÐàZ¾§ú¡áh©£Œÿ½ö§´C=xB³,ƒÌÓk+ÏöB;PèèÊÔÒ¢ ÷à8X‘Ϥǿ0¼Œ ëÀìm®jÉÍAÍž(x^ÿ˜éŒÇÙ0fr÷ l7§7m(æâ@¶#ÂþpcÏ endstream endobj 260 0 obj << /Length 2662 /Filter /FlateDecode >> stream xÚ½koãÆñûý ùPµØ}ñeô $i\?Œ¶@´Œ¼²ØH¤KJñ¹¿¾óZr)Sç³ÑÖ‡3gwgw;3;3Ö+ÿôª0«¢´ii‹ÕæðNÑl¿bàã÷ï´à­qa~sûîwßeÙJ«´R•^Ýnã£nïV?$ßîꇣï¯ÖÖÚ$»¹Z;—%Ú+S&¿â¯î—¦½çU˜,’Ó•NwÍJÛ«µ)`›êê§Û?¿ûÓíÈGf²4sö ™Ø/p^æiå§*sÌý‡-0Q©ä‰X=ñ`x@οi¶Oœºx¨í}{+ ÑÕZ;y­mª3Í"ÿ¨2E\ØÌd€-És5HD^iž·ñýùÞ·™A‰±#²GŠò¾å•æ8ð)‡úSs 8𠡸äдÍÕlêk”®1¯ÑV*UEWOâ´'°¦íV0gî,H?"ž¸0ÒŠ³.U¦µð*‰æ2•Ü7d¶0Òp£4]w^6Ýá¡îɾ]¦Qq8 ªq> £Rù ÏH¸ÚÇ u/„÷OrJš–qG¦f›äbá±ÁË ç£pj~Ù›®ÞÙž»öŽ]±(&q@_¾^¿éÚ» sOóe²í»ÃgP‰±ôjyòÝU Õó‚ÿTöþFe™ücñVó<Í«<\Öºæ¡ýÚÝØuvãÖùÒ£Ãë"ìúÜo¦ÒLÛ¹&ìp´bòŸÝX'Ò ã8c.ÎH:þ‚Ý)¥¥k÷O<»%)§sm¾o6õž§6Hƒ­Å®eˆNÛžqÜ5ýê+­w§þ¸“úL|ÏÁ§µÛ’C8ît2|}½A®eß´ž!¹R€˜¶ì'c ƒ½,°µÍp'Þ\9ç‚€¡ù´ÈÙh—~sŸ#•FL¿Æ¨«típ†F1‡5‘-¿=.‰qjùJÐk(Ú›ö9ââFüÇfsÚ×=¯ûдp ­¿ÿö}'›·²ùÈß]=ðBÛÉŒ¼O^N÷Ÿöͦ9¢þq ¾Êq€r» œPP¯1|?Íé‚ Ž`édzEIý€êcÓµž1ç9§\²Lau Åx1¿*^09*¦H¡K¾}]ëÕSm‰«5EÚ=bèÁ ]ÀcÛ!¼çU@8”9ž•mc$‚ʼn»KÊçoxll(– ÅŠu™‰.³( åÃH{eÒˆ To‘GC*ËW€™¬{èM   ÉsÌ>¼‰Ò@±FCZ’Ïoš:t:`3P•”¿, ]NÌ•~ûë©WQHcè„V‹µ^á0ií=„g/˜Í–Æö¸ÒŸ”Dκˆ:HÊyùÀ€¿™Z¢ZÆ9#}ç4÷ h¨ç…&"/7Õuè²i*ÍQ¨d‰I6Àž7‰zˆ·CsçGž0àöÅn ,@v}ö.®Öa:ö|v—Í"Õ¥™7`&Šk§òBíäÔæKÚ~hc'IÌš °ªÕØP»ŽcÂõžúíX@­Ûq‚:³Í)´ÎT¨ÙMAKÅ-A,_“ž[KÔ¦)«úZö– ¢W¤Â'ªr–lÒá’W±VÔÔƒBxR„²¡ÏC#ÃÉ!FèO#é H$ý ³Ü2¾¹ßñÊDÖNdÁ‰ª³åB¯ÈI-묤ñ8±ø.+S¶,¾£*µ®zcÉ ¦o™˜,¼V–ŠŠä56*î˜E×BùólÁÌWØm’væ^àzT…Sv‹Q:tN!©»±ë\z3Ó ¼å3®HMÔZ¥è±Ù ÄW{fÖÌaÜÌ)C¤³°øàtŽI5ùÆÞº5¡3jÌÔ5q÷Ñ„†£1QÒØ(Á2Ò÷Œš‡â^m{lÿÍCöNV¤UáΜ,`ÆôèJü®BêèÎ×,—©S&ÁóbíàoÒ‹š©VzËÓ;ž‘ƒpÊ¡Ù9vQíØ¾˜n˜ûYjê|õò‘Yò2O žß¿…M–šYñ+Þ¿ÿƒlHyKF-Ç¡¯@È£gDß÷˜» há_Fäǯõ5Ï~ôû¬ñKwñ]/P¹ÎŸ‰ §¼ iñLRný½YX±mÞ$¬ý"a‹gÂ^êRÆ»Êsqãææä5oºÜٮߪ‹ò~Ö΃pæ²™›eÇ0—í¸ÿWU¼hçÏ™~fæØK~IÒgv. è7 ëþv~™ï¹™¿x±ìü¿t¹æívާÿ?¡Î‹ endstream endobj 266 0 obj << /Length 878 /Filter /FlateDecode >> stream xÚÕXßoÚ0~篈ڇQ{>ÿˆ4&mÓ6u“¶iK!”h$©BÚªÿýì8Є$%E´SA‚;çξïó…Ϫßà(æ(+gh1š]9Ö¸ø:€2ë@\‰ü8¼ý"¥”øÔgº¨N5;?Чep‡ÙsΑ±'Cæ¡[ó‘þ’+{U*t3Ï£Ÿø3êhN‡¿¦ßŸ§Û:$“D Þ³èMt³r·Z9PJ<]¿K¨¶x¼ó2uè91plÌé©.”»J¢Ó1bÚz7™ Ͳˆ×2š ¼L˜LÞ— ĦH¢˜ª/ôár®nòІY–fÖܬEèöb8³£á*È£ÛÎ,¨g‹ã–Õ«U» ˜>¡{ªRÃýÃÁú•²ÙA`y/°j¬žd“Û ×Û…‹+iàeõÊ{â­eh'ÞGû|Nt·¹h¿1DwŸ "¥B> stream xÚíXKoã6¾çWÉ¡R±>ôšmÑ-¶Ç…oÝ¢Uej-¬%’œÅþû’J±"iíºN{©XCjÞóyÈ ¬˜ùƒUÈWa$h$ÂUZܰn·þ°BâÝÏ7àø|Ãèqþ°¾ùæR+`4f1¬ÖÙ±ªõfõ+ùq›ì[]{¾‚¨Ï—R‘·¥Ç#òd¿ªyùßšÍ< Å&Ï@x>˜áàý¶þåæ§õà‡âŠ*)Îtºçžz{, Š‡&‚€2%ÑýïÿlªÝ¡ÕžÕBt]W5’ø” íÃ׸ûNï’6Z”‚±” ϸICcÝAAZ¿»“&5A¨ÈÝCèù  õíã³íËN–9±©T䤿C)ÿHlÆâ©xùÈsyf¼#©{6Š×d[0gýþþÞøË#oòÓv[$åçßSãUQ6p‹››<ËtÝà"««ÂQóRâÖZ|‰Tƒ.™oA¸j'åÆdŽIrØÛ§ m…ëv«‘0û¤U“·yU6¸We#&A x¥ÞmÜëÎ=´?Æ[šÂuvGÎÎù†4 ‚ž=­ò2Í7Úø”·[çnïfUêcßùcֻе塰yÅ£Ÿ`•DQð1JUÂsT»%G[|.ˆÊCè-EÑD@E [/×6( œT{›ô¹@TDY8Ä®OL*ËhHaR¢Òd%56€$µÝ4 ¨ªÍ6/lš;óN¢íýI«¢èc»¼ÔÔóƒˆÙîÖiI“¦÷<ë%Jƒ •§mc~9R ʀ쒦Å$DƒhœðF·m×'y IÞØ§BY»ÑUÛŸ¶yj›è—EÒšÖÛ·$ò6C±Ï]Û= Ë®²]Öta\&m¯Ú´at­÷ÈS·Î\†ÏÁ~js×'ÃnÌ¢M(I¡–ÐÖ§BÏ Œ2œÂp²èANáSPÎ"3e”ËsûæÀã&á¿øÌv`:0Ÿôí‘,K =(\Ú¯áuΧ©ÓóÇÓÉXÃùó ®s>ÁΧ£x¿Xù!8¾\z~®ÄNù$¯™‰óo&üDéOƺPúëÄ˯Uyø;¥Ë¥³mB,W^Pqé@¼r韽–/ÃŒO%F¾Œ3¦,¾°äñE%ÇÉÏŠsââT° W¸øO .—!~j™@\Ò‹çoîš@‚qN uBàÁ?Ž”¿â„þ?aš+æ¹æpù–<&½7k‹vk/ß–²W[¤pºŒ”ÕðN!a‡û¦M>Z•ºtM¯­ÖͶÚ9ù'O$Ùœ­Ìf¯“v÷|K›qfŸÔyS9UÝÐÒ©r Ïcmç@9× ²êPwÓ¨¹ƒ»±geÚÿç/ñ~TX endstream endobj 274 0 obj << /Length 3037 /Filter /FlateDecode >> stream xÚíZ[oܸ~ϯ0‡Ê€‡II”‚º@Z4Å.ÐEèC·@•ÙvFr%ÍfSôÇ÷ܨ›9g“`ÈPäááí;‡ç|’¾ˆáŸ¾pæÂåVåÖ]l/bªíî.¸ðî//´Èm@p3“üãÍ‹WoÓôBǪˆ }qs;Wu³»øGô§ûòa¨ºËµ6J__n’$¾k.MýŒÿµ?ÕÍ·B¥‹Ž—::ìêcm/7&AÚšËÞ|ÿâÏ7ã uÛˆôm+µÕ/åáa_…0bR£\>`ó· Á’È€Ö€"X…Í’QÏA=Z%é(#³<”?ááZm=F7G0ÂÛÛêÄ*°‘ÇwMÛU¬¿#Èf nØp°%AÐ aS;Ù¸ ¡´Ö–¨b²"<4RúED#`újÇÕ„T¨¡•K;ÔbùnEËk˜BL—êÀ«êx¨þ÷‘{9FTí[rj³N݉}¥*wÅ]µ/‡úg?Ç$Y£kZžDÏì8„Ü–pNÓç’Û·U7”uã @$$Yôá¾Þâúï¹K-:ûbKÁ X¼X&)’Ù”ÝlØè¯¨©†&Ûî÷-í8RŽÐéÃÉ&é™ÓO•É&ó $)ð‚à¿Þˆv6E† í¸‚S˜Ó•œqÝzn¸‡©ô¯·¢@÷*w*™ ûÄ—è}÷åx_ʘ}åŸÀÁÁò€¼úC/;×Wbq¡Ljײpà…%T\ EèÜ£æò OåvKƒ«|Ç5ï>ƒ;šjåâüÌŽ&*³£ Ý8ür¡³ ™¨—ɘèP•  =žCGïÃjî³ ëáÂK壵ÈUF£³LA,Œ‘œ†õ ^eÐ4·Î+b{ÄnëîåûKÙÏv%¾Àð2i*ö—èÓ’ ·4ÓØ.’š•g€2_ (…+,W¡7ì¥@¨áßáÞ‹À•lÜà j¬‹¾óØÍ——3*3ãí ƒgš©´ÈŒWò`ó¨jo»öÀ ƒ_)Îv/åGŽHPœ(­ÆÅÔ»ë~ ðÁùx Sèä8tâV«3gô ®Ö)c’Åj—#vB^FÛì8È…úù>À£ìüg_Á³›Vµ'„¹ÂÇy"ËðÅX bŠEd3EI+¤2ìj‰jîÑ W^~‚.Å5ŠÊ÷eqª ¯ß„7×A©ÄÐùoHDÆÆMàÚŒ;¾  œ²F¯¥kE£WA@ýtó<3¹°…Wø.ˆF»D½ß\'›kes_s@Ö¬ÿÆÂ¦…Y˜?LË'dæyÆ;¼ˆòèšâÐìl¢òYÒ´mŸµë|Bú ›1ZmΘ *g_ú°‘â§«àÞhX°õd\|Êæ|×£W]ÀÅc½Ðq× ùÉš¢ÂP£%š nƨSòÄ:Ç ó dŇçÊÆöSO‚T–|_•½\Bm#›K™˜¥Àí ë’‰`Âwb×óXÙ_‡G¼o¯ùçÍ+¹®qƒÓ8dÑ™QɈ縆 ƒÁx£8«%Ÿâ·ÐTTæ>e&æ3fâfð ž³!ó´ÑB<7ù“h‰§€ú”ÝÆ*±ÉY<ÏQ¬˜IŠ %æGJÚ!:`ù¨´å–S×,Üé3li6öÌ–PñI[Ê”K²3»³8+RãT¦G‰'`lŒÊ³/bý|%Ao“Ã]’/C¤ß͹ŠÓQÍ®‚@¹¢´ÃúˆÝâæÖN¹BnŸ©C¯ÒEŸ)ÎÁ§Y\…m8ŠMr¥cwÖllnW©Éç«ávLŠs·ãc@¦±J5:ã0–sÛßk´9kcÌ[t^fP†û¬¦0Ø ÅÒëzÕ—ÔÃRv7‰qT2À±kd„©ÙË>×´Ápsè| ˜ÐbC sÛ-—+¤c×üÃúŠŸs B6'.¢‘Ç0uµ0N ØMÊ©f†°Œ…!¥™s*ÆYÎá°~‹ªîËæ®âðÁTÿ‘(ë#?´ ¦Zؼ÷™(4´Ý®ê(ö§·«fæM)¥v>ê½rY3¦0©LÌgžJ$Ù_ÇÞqëh[ö4 Ô} œ+JX7’ÇX-Y$½ +i!ÙPØRuò/Øè9·ž[š–«ûªé+ Í 2~L¢:°pé9ŸI#)Ž_Ó’¹ðIm?”’[Y Ösø£%üÑfeJ¼ÊQ{æne£5\Ö çq¾‹½§ˆk6Rõ‹Ï]ŸzïÊ¡¼b:‰·œˆ7ÔL¬Ö>t²+Þ2?ñ‹>DyœŒĶ«$1‰ÀL¸—'ˆ“» ÙB¢Ò՞’L¶–!JIšË÷$ØvåÐvž0HÓ_æÈè> F|‰IÈë>Ä ZFd5%8ä°ðahù×R{/…5èòµ]CMÙ¯;AQËëÀ«Åͯ–¹ôÌŇÕÓ¥@=ÈíÖ6WQ,n‰¬û,<ÿË wÜçÆîÊ|r‹~±XfÄ’eYdqHrrX qìEtìÿ$5jÄg£/ß¼=ÁãÙ|ôËC{WñTþ¯)öÆy¡ ¯,›'ö–ô)2tšðn geº„ðc8N¯ QÓ~Fi ³)²bW*Ö¬ië×C… ‡'È •/H™G¯®lîs¹Ü÷X¼ì²ù‚6²ò~ÍŽø£òˆ!ç!ÞqƒXü\ùÄ–Ù|ruÔÆã¤G&jº -rä¹ÀåÉžî),ºÌE%3Ozǹ­û _¨&ôBJ(¡ÖƒP![âf(¤ä5%@.3#;~ÇZi5XXž9Ö<‡þq¹yšþÈÝœþAÍ“_Ƨr»…@€ì8Ibôol¦·d «è%sïŽpO)£œ^”üŸðEɧóEö_ôëOBŸgîÎ3HÒp'ŸƒÑPž(=¥›_œI>ͽ ))Tâò¯Ã]¥Ëqfoû¿„Eúã“7V úÁLb"ßÖ¹ß Ä¡¼_hÆ.çÅ6|•ØÐýMbžu“,ß9ƒ°#Oáu˜ÝO¬ŠóoÎú›³þ*ÎÚ|sÖtÖÅס÷?ÃY›oÎÚú­‰öòú iFŸœ·\ÑWÄKX#©žœ°²RË^¿WÚTx/Ô —ëŽÕ3Ls–Át옳ƒ™c0§¯#– ¦9Å`šô)Ó¦ÄT:¦é{˜7©§¼ pW5‘+øÕr3"8eë(ÅyجãÈ^BŠy'·+Õ›†­ëC”¥žs–ô~ž>ÜÂÏdü™BÂM_SÊ6ýñɪ–>¦©ü­<d±¼ •LÔÏ4œ6Z•ÅcÇ[œv¼¬Íœ×FÔaNÔað…ɬJŠty"ÿ¡ã8‚ô øŠb•J ÈШñÂ{OkÈBã0ʈÒ\Äw —ø½t”ÄÏ&˜øûO‰øË‹æ‰x ÈN·õâ‹ÓÌ<úâtôh·5ž#{ªúÄ!à÷§ñ:~ÛÕýÃÞ“C¡ÃÐl?+–»´Yý…Ðüò%N(siôò5”t ¥ß__óVêçö¸¾þƒôP´(¹’æôÀ›‘B9!Û±(c˜·ÿ«6è•°ö;—çöbÿ3<0i³^&‚õÌBÍz¡¹ÿ°ÿ=wØÐ endstream endobj 278 0 obj << /Length 691 /Filter /FlateDecode >> stream xÚå˜Ûn›@†ïýȾ(Èa;³v‰êJmÕDíeä»¶RÝ'¨ØXGÊÛwa—ÔP|(‰DÉ,x†™™ý<Ð;:’:R1¢˜t~Î{P^Í®3¸ºì¡µóµ¡¿aù~Ü{}!„ƒ@BÑÏ6o5ž:_Ü7“eežÏsŹçs.ÜO *÷¶øHÅ‹kó­¾(ݵ‡î|džOhkƼoãϽãû<Dpv`Ò•õß™›™#DP©7é¿û±J“uyÅ]Ü(ËÒÌ Gæ€Ú½Ú¢!œ™«WQ2ÉãÛ­^”0)*/ y:M"utA&ú`€zj)ÜÁ¹žzôfdoD”Ž`}¶»ŒFoï]L°–Xû•Â¥>=XiÍë ¥¼©”sØ£”7•r€®BùfÊC> stream xÚåZÝã¶¿¿Â¸{ˆŒ;3ü”Ä Wô½ }h‹`>´ªØòZˆ-íIr.—¿>3’½ò®ï’>ÝV9$‡óñ›áhŊïXrU”Š•ªXmO/¸ëíïWÔøî›ÂÓm€p3£üãÝ‹/ß³œYnÅên?_ên·úgö§Cõ0Öýz£”ÊÌWëÖ&û¶]Ë2ûÿt?4í=Bg‘×";íšq¡ÖYr Vzý¼øó]äÃHÃŒV72¨sžÏ9œ³øÏ7š˜õJkya²W_ÉõFh}ýöí—Ì,³È챊 #®Ïyûöw4§t3 +dágѤ?|?tÇóXUÝ÷]OM¿—.ÃOýš¿¡Þïêc56?^%™*L˜µnïߎ©¸¤Ý_¿~ ŒrówÍѯörMñ’^vÍ~_÷½ìûîä[)µ|‰;\³Io$g"÷‚½;ÀD¥mÖ=ŒM×úy‰:LÎ ¡@ºnÂF.­- “yhšÁ¯Ù?B Žsª«Ìk>ÒȇCÝRkt ÉypÆ ]Ã\VoÑøtí«ˆ¬&E¶ùä‚îü"ݱî«v[‡5ûz8tÇMÙƒ6œÄËœY©R+ùÞíÕpUfUÔ¿V°g»£îžŒ~â‡v °AΌ԰9[o c³4ã¡;D6P¸ÄuK+™1e^{>¡š—Ĭ5+ ·];4;g¸Áˆ^ûÁ¹2uLnL<6ÛêH‚Pª`ZÉÄò¬;”¶âYýþ\¡®”È*ßuì¸ï‘ÑÔÕ0RW×ÖÔGr­GäÇ1U;ã¬(b·Š©ˆ‘À‡dK4»ŽVõµßµþi[×~4¨4Øv=YV×îÖÉBO¶ÚÓà@¨=1d™ØxBs€TzRø†›ð„MÁŒ²aB_ßW=ŠÜíEÕùe°}>yŹ®IIøV t†õû5èœç9UKS2b*Œf²²Ú)© ãÇ×™f¬òšî Í@Ï…f°§£I¤èˆ*öœ²£¢Î"“B¦G‘Ï…ù)NµaBˆGœ2nB>Åowhi‹1Hðòíwô¯ûd\|OÄ*ÿýg‰9‘+ƒ‹XšËKÄß²\¥½\]:FîšaÆDý¡9‰r¦e‘Ie!æÚTo›‹Ÿç’q™øxóXYÁreŸˆ‰N¢˜Õ&!õ{üž(ŸO}ä”úlô©O:+g|6ëYRY.™ •T¶„Ê%œ1jöæÌiiG¹’,Ä|KyË–Ké—Ì-SZ¦6àò/©%yÀèÛ{zŽaͼ| ·eÃׂi_¾³ÑME**néœ6g¥(?ÙÊ™3 g.d\e„dE¹Ìa?ã0¿ÊañH÷€FRQ‘šôU¶SEÛ¹>Œ-ŸµÐ‹§ôœ|7F]÷ôѳ, Žà…„ÔõˆËŠ‚,TO&õ”¢f¢QЧ®ˆFh;×ÅgiψâŠÔÌe¢Y<‹b\=sµpþ_³´v»Â<úšOb=â“øÐžÊ“qŸ‘8À›áà/ZXtq‘}gà0ß6õdš˜WÞHýJͳ %÷ŸlCcºÿhàÂÎ3j·J¼è kPSëTу´Ìèœ$k4Ý ]/z:Ài1ò[¨òl‹ã¡ÜÉÝÔ«Ø'dñ¹ØçÆCâ:r8-U:‡g™a`š+SÍýæ øì‰ìo†óÛÞ¯ÀF¼ô U¤9ý“¹ì禲â(—ÿǹl™Ä °×k'E 5óLYÃC4èSõÚÐoÉ %ÓBßRCƒ ¢ÑiÆ3=/À(Î!«3€Ç3â-Tþé‹cî|®Ä‰-WSá|îenN´D÷Öú½büô7F”dÉJ)—¹¬€)ª³€ó.@ÿì:+]õv^RSIe4F=…Š…ØPÎ ÅOVÃLÁÀ.¢Fÿ~¥Pl´¾M£ŠI}[Qt²‘P%^SBhÔ FCTÃP‰4_í ¬L×$²°H8ùPÃê;/…Ö’J“5 ¿&·±òr3LW’hLX”Öx¥£ï-FyÆ–¯†+_®¡öB-ÌÐ5ŸGª½L.ñ×FO×˦¤„»HþÍÕÉà„áVªÚÆzØñ1¾{‘2l¶(A 4ÜÐv<’›DðEÁš%ÔQÐ^×$ OÙ;ipCÒ˜¯3I^PX$T&ûv½a©"3:´¸Jï«®½ûðÀ}ƒŽõOÔëë¸ø×ß/û%¥Aöö~¤ãk³ÀiC¬ÎåW¡òT>Cô™­Æ¼S"ô8%êYýÞ%Æ5atNi æøÉ¿,@.G\akþµ^û7ѺŒ…9l7§ê¾i«þ#=T½ŸpCëÕÔ…íàš~ȉé°q»!õlµ)EÌßRÓœq„°G%x˜½dÔÄ’¯/À* ©²ë°ù¶=,¢Eð$ûÔ!¸„Éé{Ðæ¯W€´°7©¶ò6$ÕJ,@©-/ Ô–“p\!¿ˆC3 õêB‚xðˆ£( úPÁ!#6Õ›ÃVIªK(J=Ç| ØmÂlEê€Øvº+æØ½.¦Ã“`[É"8]Ó†àñC¹rNˆ#dŸ½_Ä?CªàÖ«ÚE@9ø0Ùž‰&ç š·™¦yEW[f€jtŒ-&ÝçèI£Pð@N0át;"¦0óˆ9êôKαÕ耭†—ˆ­WOL VdÝa¸ x…!DP‚SpÕ÷®òë¸Ê‹WyÄUΧ½£ò¨°;…*>éÒúg°pZ¯ ÿ ñ ;D]+ endstream endobj 288 0 obj << /Length 3341 /Filter /FlateDecode >> stream xÚÅÙnãFò}¾ÂÈ‹eÀâ²›Íkò–EïÃf±˜}J -µ,îP¤Ã¦æÈ×o]ÍË”%ï$0 ‹}±XÝuWµº áO]¥ú*Í¢ ‹Ò«ÍáMH£íÃ7þýã%ëÖ°p=ZùÝ»7û!ޝTäa®®ÞíÆ Þm¯~Yý}_h´ö÷cÙ EwÀÞÇ8§å¾ýüXuAd@äê"êë(©UÏ9¨„Yþ”¿— BS¥gNßiÞo”Å,Ù¬«/Ür(þÇGØãcUZ”£0]íš–gY^ qt¶u¥ØpD(¾òŒ—C FÐèš(_Ýùpì¨ 9F@2>U <*>qüù"БÜ\´Èô{eŸ|p¢´xè×µþœ£‚†¸W—×KçÛÖýé %ñ“ jš1jì ea¤Ùô¼ªÒÍôkç•þD¡’…½md¹ •t‡N j@ìŒÎ‡WõçH:™œ=XNª–?¶–#¦^ë£>®Gï»ã½ëÊî("Ùò½mE^áÌ4Œ˜qÿ £ ð©.Fo1X"E¸¨-èö4ø¹é¡.ÿ Sñþt„§n°õÎñ»™°j×xÿ“ö…CL%ÐÒÃ!7^™m“Æ>•݉‚ëz£ÊcFî°ìë±pÎJXÌ*Ä ¦å´åWa8æÂ¦ŠUJÌTå…¸éTå=Nê ¾_  ìIê¹8صØÊú4J§XôªB »]Ä]§2.ù¿¿ñû‚xâƒ{,6ö,¦Áï.FÆñÎÚí+œj}1ªµý:æUγ½ÉMѶ¥TOwlëW8Uw9¯¢±3í.Fqß´å ëMrtP#÷¯p¬/ÆùcÙ`¾¢+)KÁÈG¯„<þ¿X…yß³*Üþ5¸dÉ‘Ÿ¸[u½¬AR ­§›ê} [>ì‰Ö÷¥Dss—02}>‹ÈǘhæœE}n³!ó´é9tH”3zùÔ“ÖA4ìôÄ&´ 2•˳ÿÏ µ2´-ÊÎ6Ž‘Öàm${}^Œ¹&¼õÓOç3Äדüeü„T07' õ©Ç¸'•t‰Nc€{Ê·œ5D÷÷Ð æð.æ—É–›À ¼·¼޳âÕ0•Úòw:NlrÚIŠ#É æY%™OQ†â: î3ø–è5rZÖ{œØp]Û.Q™Âìt¢—û,âkKfcb¡cëä9ÉEäE·3”žñ`£4Hòèlò*R |°ÜÂÅä½cö÷\Ìɽ*;~br€²¹FµŒî¶<‹9.nI}PQ†’d”Xã±Iz J\T‚JAp©QyPzeݦxì«E00ʾaÙÁcRÈ}—þR' æ·M(S½6aH¤§ã禩]¹µ­ÝrÕ>ûrv yÙc–ú‰Éo±dœøs(Ù?h€‹ZÙ)„´ßÛ+ðR¹6¾õxni_nωʚ¯¸—ú>Ÿ IÙ³ú¯B|*¿-s¢ Œ뙋„a|\äëdo4p²½¬ƒ#¥“'•ÍÖ·1›•ßxb`n~Q(Cy”*%?Âß/)±™… ²8~® ·Xøòÿß> stream xÚ­Z{oܸÿ?ŸÂ8°ÜzyâK”‚¢hr—WàZ 1PMÈ»Z¯­äHÚsÒOßE=LÙëöp¸,ÅÇœço†æ1üÇ/Œ¸0©d©4Ûã«Øö¶wÔøÛŸ^q7o7“™oo^}ÿ^ë ³,ÎøÅÍ~JêfwñÏè‡C~ßíÕFJé×W¥tôS}%Òèü§ù\Öw4 &:]ñè¸+?Æ\^mDÃl™\ýëæÏ¯ÞÝøsh¡™VòÌC³Ÿ99c–ÂùkE‡Wo«¦³Tp¶-ø·ùnÔa_•5íšÓmUPûË©é 7~ßÂ… ŸG]ÑÚÓˆ‰úƒ›^•@.¯hþ/W:‰òêäÆš=uçU<0.¹á’qÍéÐeÀSI™À´;¶éT×øaì$li:Ž_·Å}_6n)îŒãŸpàU2ãU–2. lm·ü›3ã§ffœqyMTÃÔ3É0óÓÙ´òz÷Q)Y–ù5¹Tk„SO˜5nP\Î-徺gš2%Å ¸2»È ¯%4þöX¥ØÈL°ŒK§4Ô}nUƒs”{‰fÉEÔÝ£©EŶD-ÄÁ£ÕؼyÂ,¯WÐÞÁ€Sxü$ÕBîjÝ\ïmn÷¹«òî@]t€Ž6)û.°@£E^Ó15uõ [Iôp(jêÛ7UÕà^èBŠõÞb›ÛÔ…[¾§RûÙZ·ÅRÞà³tœ­ÈŽ™ý¬ÄÓ™î¹bpçD¿ÐŒz‚˜·ªïÎ$&Ï!ö”1=¢×´!‚0~6sAÿÞM5«ü«‹‡ªY†d‘0¡¼ñýáÙ‚ºžFoЯª‰ÿV¤ÎØÔÑ1wJ„· ¦&r#vÒŽ ¦1'¤'@ymÄþû¶Ø;W™¬2,—5µXç§ #ýx£B­À ó޼ØÇ; %éGàOb2g°vaçÐsJ~,œWƒïßâp ¾ÿH?‡ÜÇëUR£‘‡5Í€%S\’žIR"·Ñ™ô#¡+“®a¹#Rf² è%àdS¢Wk‹}Ó×xàäE$Ⱥ…±Á÷ôѸÑ]Q•Ç’nߥûÝãAZò};Z2H ‡?ÑÙ/Ý^AC …iª¦–Ò‡4‘s¦´šÚÊ*IˆŽ<›¬m‚çÄ)1¨r%|õŒé—:<££*€ÍˆOƒŒ¶åÎ ±o¨¯°p¬pñ PÏä~$)‘¦‘9‚XGeó HZ- :;ÎRã9TŸî÷¡û(9½Ð¶9](—‘õRvËîМ*×{KVôˆ\êÄf®àÃæb£MwyI-«WVðŸåÿß]^Ò‰˜ÝK¥Ðö®t_V'rØ¡ n¸1ÌøCe´Ò_²nú &,õEY»€4S%?ï „-ç‡ù©ÀʨÊ{Ÿ¤ló®X w‡ñ7ö=’’@Áá€nÕ»¢pŸmq_åÛùrIN¨o˜BíåŠeJ͹4ª„%É Ä˜ÔLÍR¾„„ °BéŒÎÁýZ‡ F*&¹8ŒÖ,3j~¯X½‹ËÁDâ ?g™Þ-„Ö矇P&åÔ­ã`ðÆF±TeÿƒW§ VržÖœëÖ‰ c“ZÏâì~Øíˆ&dÞªüÕ)YÐg Á!9QaS‰EY¡ÇC:òåT¶ ©ÔåÃÊ :êÀÕÔm3`7@‡\A;Óa|8ß›CÊêUµé®¢„醲}è»Ï»Î‚>XQ)$×$c‰ò*ºéž—*ÑÔL³NBƒ›Tó—ß:ÖÈLQ.¿+¬1<_rgb6žÆNGÔ6,c¦ÛMá~oóSWt‹Ue×ÇÌéÇcÞ:°Ç¢ëò;7™t{¼\îo²dè‹öXÖùP®®\¡&ŠÔܾe½ÛÊt‚<à£=ÕÔøËi,DÉÔAqlº„FCõ’ (&Æ\nó6¨ŠÅ~ÊÇXÇA—Y÷›Í-ܺýö¼ËrÜÒ] »B9áǶ-r›¾àÇ "XKÍŸ?üØÜ}ÿ󇿗õ®ùÀj‚ÞàN%Ïa-ä=dDß0ëFöᇇ;XüBhßS{Í~yÊ´ôö²ÍÛ¶$e€5mëOmÐ5B é÷Lm‡ª®%µdÏ82:6,×MtئM ¿Ââö¡ì0›"Z˜ÈeÕÍ©e†1AͳµIœÉF´g?J,¦lmÖ†\Ù;ßom…΄äp`kYRªr‹|>Ðg×çW–õö+ïk‹Ú‘'ã“d|b€¥ÙDìšÒ¥]‹ã[»¦f׋P>‡šÓ•mNÉœI¢í¥°×ì± ¤ŒÞ_¥¶ `'”5œ<²8M)«M"[>ñF.ɶÓ!œzšaohùâN”£ºB%Œ8Rî†Ð1½îÑ8£X ·-îò–„»+ªHYøCm¹µI/tMtJO ÔÒ†3ô1çÀ–˜¡ûÚT‰?\áJŸ†¥B`®°mê®´ö_Î|´½YMå¸Ç&kX6Yäçö*ÆØoáÌ¿ÏÛžvlö.îņ¥ò¦†å¡´c¸Ãj¼huã@]x n¢Ç™×/mëË)¯JKÔAª¼R›z38[ÅÈÿ°úî/Ë€55l…ÄPé[bi‹?qlk§6¬Ø!ÿ<`7ëií<ÂfÑÞZO– ö WíIR‡÷îvÔuBF üuKn½¿È¬Y…º<¡ Ø )}¥¯ ¾TB1νÞñ×çàV’¬ ±(IÓÍÌ HEK½Ýˆ×ç!d FNÕD{doc–,k·È?’™Þ?ò¨Ú}î³+ƒ¸O`%XÈâ¾Dj B&''ÔÞÒ-âN [Ž—•-ë§þXΠùw låA#Ó·‡'D­'IÉZA²™ÊG+þ¶Ânf<†¾|O)87ƒ9CçD¡ŸtºO$ ìrGOÌçÑÝ›ŒP‰oØ¥×ÒSÆDÒaëà¶0i‡æEnºPñõ¾*·È…o[…kØ´’óÙ}±ßÞÿ>u=M±1l\ãÊÙØÀ«ºj¦­mãltö8æœý5½Øü–°1µ8)ïVO2–Æò0¡˜Ný3 e~ÃÉò!FÊT/¥¼ÏOêK*&¶šÎŠñA¬!˜ÓûÛ*¯?‡N%\p1"§P:Ì ®3úü6h. ¿¨":‚3£ôyi5ÈÇW+I›Å † ]L7FŽT¨†lfú¨!3=øèT¬Iˆªãû¹/´"Š¡˜€Á)“É¢X~É_¿v¨ ËOÁ’+xñIéÎU\qÉjÅ5™•Ÿ.wv)9}<”6çÁñ¡"Tü‹ 1VÙ«&ˆ/ŬF·ªüY]’1èï9J ^¬äžÄÂé‘ ÅÙìï ëõ¤#|Eme¦fW£­õÛðñéôÿ1²„paÝÆø¶Î:Ñü•è·ÒyV±Â¬ò7†”DÎ,žg°+л*Po Œ(Úz”Û2'¬ÕØÖýQ­ÜÍ @)üYFGûÙœ¶ãþþõ< `R×·öEæÎ-²úSƈ£ç±$Qä£p°9À*°w™ðá%[$‡ØG76!¤5eqÅý©¥£ã¦sÄÖëˆlίߛWꈉòEûÉ)ZÙ1oºîtt{ö,©WgªV^BѺôX¯¿+UmÐiÅÌ#· ^HjH! }bG3eÆA›ÔüÈX…h(Æ¿o ½TÁŒ^<®n6o Iùï8‹7›MÑo6o‡YñxÖ0éOJ>AêGOJ=1ë§¥×7|ïI%~Ò’Gñã‡Ûsâ%[ò [øê)o'lnþ•æCItÆ endstream endobj 297 0 obj << /Length 1255 /Filter /FlateDecode >> stream xÚÍXÛnã6}ÏWØ‡ÐØo’4E“½íãÂoM*³‘%C’·ÈßïP#ɱL9ÞÅ6ÂÛÜ8çÌПðËg‘˜E±d±Œféæ"hw«ÇN¾üvÁ;9 ‚ô…äÝòâ§ÏZÏxÀÁ‚Ï–«—¦–ÙìOòalSÍ©”’èë9UJ“ß‹¹ˆÉW÷§|²Å#žÂfDvsN6™½¸œS -£ù_Ë?.>-‡8´ÐL+yfнôqäá8r²@+ŒœÒÂ<È{É$¥Ô…&)—ŒkÞKe½UL¥z!3˜‚X&M­S! ;©q‚Ò‚A¤¨T™zëELÚØ6£&žÇ’°9Õ‹˜ÜÖõnc Á±"¶p£&IIÎlcËâ v@ê¹…b‡bÿâ"ÏP:·O­Yáiûè¾ãÀ¤Ü5Û]·ÙôåaZn6øÁâo‡ ™ˆä˜EíG ,ŒŠ\^wkÚî¹T5î¹iq‰s¨3[CF9Þ»wqpï^FxSÊá#Œîcº¼öN<|> £_ûx÷Î5õ0ÒäÝ5̸†ÙÏ77s÷ɉÜz2ŸÂÍÍ/¨´ 2žŒ¡ý¯ï={iSŒƒxÏYðJbè`º‘ŽÎnê2ß5%MU•N;ànø1”_áî“»'ã\-¼¬ÇûILú›‰iHîü ŠiL¾“c“GP1‚„O+ q€’x+&â¿Áä{ÊDNcòá\!é1‘'ÊDNa"OÔ ¼]oÅDþxLÔ4&ÏÕr‘y09§u©u¢¦0Q'ê¾Jar$êǵ®áfz“OÞf§§!1o}Nô‰:Ñω>Q&ðÅý­e¢ÿ˜„Ó˜|öæ"œÆdõ &î5ßdAâ endstream endobj 172 0 obj << /Type /ObjStm /N 100 /First 877 /Length 1806 /Filter /FlateDecode >> stream xÚÕZKo7¾ëWð˜Ê%‡rX’4mÐÖÍÁ±×Ž[kÈ+'ý÷ýf-»ŠVAíÝEœ$RÜápÞ®|öÆŸÄ„b|fã cʆðñ9›ŸƒIc2â¢ÉÑH XÅ(Å™"qæ…Œw’ð(<—(>§ ø„nX#F"&EWÌ ‡|RR` d09É,fÝèLƃâ_‚>,†œÇ‡€®$C>ëð1£NÇØ±I9æ9‡ "ðD’“QŒà!8¯&¬¨1Q&§‡ðÈ&‚ ò΄DÝñ&(µä=„ ȳ‰.àXO˜@˜DÎDÙ1FqEÇK11À'Fè‚ ­Èü6³¸xHàüA->ô# vuGn§2H˜@aÈ–@û¢0ÞpPö¢3U`ˆ#¸¦`NQ%g8%]pVÌ Î!ÆJ º„EÉ`˜‡2b6É1a"~F\L¢¬»²Iì †AÐyÊø"“D•‘°]ôPØ^*°I)¹c'LÌ0ÃNg„Ç™HM¢ò^ȃK‚ÕJb5%‰š!ŒS€höðá¬zjö=˜qæ•©~ÿãO£$¦bo±:=}7{ô¨Ûk­yøÐT{)l­ƒßëçzgàõ<©£tsl¯^.›Ã×uköMõòéž©ÞÔŸ[sƒùÍßç5œÔ³êgœR/Ú u3Ý>«^ÕÍjyX_tîÝ-½¨æOšÏfßa [žD¢ßá´ƒ%POþx±h€q¿‹"J’F‘«1tã%ü¬z½zßv¿™/>Ϊ'Íò¨^^éÞ)]‡`Fhá]‰³e`cbËð¦”ÄF {ÜÉ쵩ž5oa?x|ÚÖËÅA;¿¬ÿ‚7˳ÕéÁÅz®Cû¡{rØœ¯Z6 ýÙo<[Ö§7ŽæÇÇ5X>¬PiæŠO1Ú‡÷)XR>˜môÿâƒb¶š?¶­’HÅæÜÅ]ëcÚÉÌóÅeóq¾8Q:«3%e“õ‘Ìÿé#;À|¶ HÝÆ—6ügÓ¯¢_Ï5¢Œr+ñ}·*CÜjƒeq“FÁ¬õ#†Œ2>Bäh )¹Ëè12¤£‰&[â¡¶(> stream xÚÕZYoÜÈ~÷¯l,DÁ†}ñâN6v$ÈFoq€P3 ³œá˜äXñ¿O]ÍKKŽå‡Ø€ÙgUu_U÷X]DðW]$ú"IM˜šäb½ÑhswÁ_þôBɺ,\VþþæÅoÞ;w¡¢0‹2uq³“ºÙ\ü#øÃ.?vEsµ2Æîúje­ ~:\é4ø„ÿÔ¿–‡;ž…Á$8]©`¿)?DÊ\­tÁj“^ýóæç¼éåpڅΚ' íW?”<K®¢(LAþ8Œœeá_½ŠA´8qÁ«k}µRZ¿}ûö I+Xˆ‚“•2¡rêü¦·o×oŠi“ ÈFÞ÷î¶­«SWð¢iꆛÂØõŠ•zã¿UÞ•ŸÎîRÓ]Ä{%Ìá¨&ÒÌýõë× kä¢à}Y µ—MqW¶`=õ’6åv[4-w¶M½—ÖÃú%rš;T¼RqhMÊ|ov°ÕFq7w§}AŽÑñÈ¿„ÄÄJ‰ S0OÄ»W?²ë\^ã׫÷W¾ñAÛò6—Kbeihbãi^2÷òÐvÍiݵKR8j›ø‡Ó5³DÚÚЩÔ/ìj¦ ZÊ› · ƒ¢ùÌ]XQ°^Ÿš¦8¬E7õVtÄŸu]Õ¶¤NT˜¥zêÀŒKR[Z{Y®—ÄEÇè¥2èeÆjÀX…·U~ø•›çxÅq˜e®'EfX`¨Thsžçx(î«òP|™gþœY¾ŠeÞ2Ë{2HU13?:²£Ò±p ÝN$…½*èÀ4@¹EOÒÐV½'Û.IìB÷fÉ›eB¡N³Ð"% —Å=¥–ÈZ&ive}X²J£Ð .è´dMÚ¸·8ž‰øòG" ›mqÌ›¼+6¾ûñÄž†B¡I–ƒªáï¾ndàË;àD”…Žc ùO¹›æ~Wà†²r—ŠÁjþ’¤½;°¼™·W1rØÖÍž‡gN`gJ§©z¶ä¼Ò­Ê ™G”îBl J§5±žd'A¡ÍÜ…Õ¨8¿qG/‰‘©06=à…a¸ÄBklúELí/‹™RALšÞu%YÞï °./ÏÆË†¢EMéª%º°0òÑ›%ZI¨³™ˆú)¤V&SN+“òÕü­1R“ L\È„øq+ó[ž'G¦†¿ìÈ8µFÜA,¬;†Ã ŽÎ[Ö5à¬XT’ã«  Ç6I3~€¢î?—x«Ð ÂóŽ;þ[y+M`¬¿¨½õ{ŠV†HRXÑHý=‡‹l”ãÎbÑ£-àÊàâOLm—qª ðHîÍ¦Ä SY£ƒRäÌG2Þa[Ùö‡ ÁÄ©™>}vÖ™ >Ä\èn'œƒÙáèØëŽXhÔsnxeКÑpUþz5ì[VYb!{˜}u^gI¨Ò¾*ºi* õEo…~8Ksæž&AôYy„û¤\z*u&Jñ…C-ºÍ«ªF-Ýcø6ŸúÙ$ËEߢéocTºàmŒÃs™ëü:ìs¶E;lHÍwM.ˆ„¡RÈ;É ùV®„6(±jO"’$!é¼9 ÜŠ¶Íï Œùóqû÷’ód–xŸJûÄ cåÙ]Þò\ÎýöHex±.©@€‘}‘³¸j[Ë>ÂáÐî f$S;Š­ûd^VÀòz»äc¡Žõ£D<@tÙöBí½™-¦ûÈMí|‹Ü1°R‚=#åB6aç„ ©`dˆ8.;ÜÕ'¬ ±=/,øx¿#]¨@拎ßpûÚ¼0B@»’½TÏ«å¸0€ßʹÁÛÏÜZúH¿ä|0>“gÎæ…MŽ}[d—C£(gb?<éSì˧ɶ¶“êëoÀ“½üŒ [øæ¥Mlm>•k,ýhzË_Αš«?ür°é‘­°sÌÛÖo…:jlRÕ>^2éÞ§)DäÏ,šp•X7“UCõ*òËí.v–œ'}v‡ÐßåôhÔ”Ç"¹p¨2F`¨XBÑ:©K)TÏãÇû«”ÑÚhåu XˆÀÃMÖ¿êÛ\ù@œëÖ~¬¬¸¦ÕÂCâ¤BðÛc ÃkÂlV3Ï¥ð0P²&öQ¼ÈÜðáy´ù^Z”"f¹HáT»Ð&3ãð)A…M±®÷ á&Ç’B.fùñè¯a¹äƒ¹ò—Šýå£i›ŽköÕù÷ƒ¡ê·²‘žõ'²™DÐ;q‡óË f+F‚›l!tøöw`–e>"±ÑÕ ºóˆ±>~­ø–õ5.´(=ÑýIÇþ~;VÀ_•YX.r½,åó2¬tœ—r÷‚64Šv=’ã@ªK(è2¸<ñYÇï.UmȆALPü'ß+™Í9¹Ôɱ„b±|¶U.•>çR*8ëÅ=H§ãha 7)T³—6ÿ†7åbm#1Wìg(ßç¶á‚ëØtÇ‚¦¯~äÀG_›avóï|=  ñûÌÙË 'vgý­"`î :Þ,ñYĹà¾)²p)×/ËKD†Óžp«/cœ=§h…Ï飰¤Í• ƒ„LØ›x'M“AÉ'T>â WÀŽ _˜®QÛü”·‘-Ï#$ NÄ¡Jf&•·;µ|dzú[<2nîëÐjeã8¸¡»=žšƒ¼6Ö'aFx}±…ƒà]¹>U9¿zÁÄ÷öTÉû%ØÒ¿VNQùîUu%W‚tî¹0TJÈTØë‡…>qi¡;«Š&À¨Ç5|©k1öÑ{ªõøÚ™+[ÑBIžÂkT|½?âÕ»!+ ÆL¼“…b@à¶-7,…¥á=h«lkë– ûnðŽbñUiö£NUlîŠfñIîæÃmìzñ-Åæá+¤²IS“²áÆj‘Ÿe„ïÏ9Éí¢@éÉ»·R†¸4{øö´ˆÜY)±6'FçQ_$¶ÒF…FgS½/n凯¨ÛÿYTÁu(µcwVTcÇ?Ü­<“VÝwÐê»c#ZMâoq€™V³èy´:vÖ›º£ë2xW`ñ&›=“bmäžG±ã_<¤31‰\óãîkcΊ¬¢4L‡ßiŠå7[wD•Lóî~®QýíŠáEŸ…õE|±ŠßöÇÕî#ð¢À‹úvx±O†—¯Ùï.És‚‹úè2(5yF¥>÷ÿ.P²~+¸ôzµÆ}…^ñ¿¡ü´Õ’S endstream endobj 307 0 obj << /Length 1504 /Filter /FlateDecode >> stream xÚÍXÝoÛ6Ï_a´‘‘Šå§>ŠeX—&C÷²¡óžÖS,*jKž$'Íþúy”lɲç"i±°Žä‘wüÝyG6¡ðÏ&!Ÿ„‘ ‘'óÕµ½Õ݉?1Ç磿ÃùãììõRFILc6™e»KÍÒÉÞÕ"Y7ºšúBO½™úR*ï}1å‘wo~ÊOyq‡£Ðz›)óViþ‘21õyD[ÄÓ?g?Ÿ]Ï:=WDIq¢Ò-÷¾æÁ®æŒRþ¡J¢òïò,Ó•.æ‡e8>c‰¥" RDÈú[`³±òš…#®7U‰Tý¸28Ý4¼r‰yߤi’¹^èÔ­à¦%KÇz?U´6º~åTêíšóðNëbØgÙ˜îRA;ÆyReƒæåjTÛ¬œŽÅ`Oëª\Û]€;€€ Î0L¦®ü`¶“˜ŸG`V°Næ¾ûš½+éU›;òfŠ‚±TgÉfé&€/I½L±‘êe¾ÊÁ#Ÿ‡ÔKêÞ\å•›fm¼ÐÍ.³Á8lw•) úk SÄühªuò¥NïtÅ€–±rðQP²5Á9.X/J7õ›1UÀãŒy{þæþ¬.´¯ÄË—~"•÷ò ŸúLõÝå%Fã*ô@(I!‡a0PÊ1¡ÈÃ//¿wÙÓ$2õ÷øƒ3®’¼?v£VaÙ),†ê°¾V—ð?rL£ìKì Ÿ&QT' ô%N¤#ÄÔ³:Ñ‘[/ ¿•} FÁá@ ƒ¯âEÁá@{V/zb˜uúF‡‚CÍHî£(:Œ„Kã)¿ø(ÚÕf/Š$U_ã(Ž‘êxCRæ 8RÆ|äBˆçôvDf‡Ò±Dñ¹NcÈTuc 8ƒw“/5êðÂå/°™Úd¶ÆFV•+G ùù‹ÑÔ•G$ryDŒ2g6#‚¤©r›„~rM“‚ îµÉ^VV+7‚3¸Kóº,p /ZH¼Üª»é¢íèg†Ð1/‹:¯›×lרݬyž=ÚÚ ÉcÆ¡$ŠG³v wXöóq™8ÚT é-eý+¡K?!û<¶J ³­4Í›¼t-ƒ ½4–IñÉ0 ê-Ê*ÿ§´µS“,kr»Y&Û©635D¡–y¡‰©¸„÷>MT!0dç‰;©éHò„¬e42ÆJ Û ú«ñV«4âg9‰ƒÁÉÅWi¡NM…#¤DÈ ,ü}vãG‚yMU`F¡0Áac Ðø’i¤e¡qüÖùéÝÔX{B·õLÓW®-–cÛ  U‡–ÿnÔWá`rǃ•Ioý¤ºÛ¬4Ú‡FKˆX‘HFí:™Ÿ¯¹ýDøy{Õ:™$\ñ†£ÆòÀF–,FíÁà°é w˜J(mj,K%8žÕÞ ý9I!²VÆý$xh¥×•®a”yÎ/ÑÍX™†§!˜ÿxÄql‘67ÂÁàRÆØFÂ]~ojíÞšÆ#ÒÊhðƵjý÷ÆÔó® xœèE( —Q ¢ŽzkV¹"ØüÅÈ£±·jåA߯ªWH¢h l%Ù8:Û„ÉsƒY[JšŽQ?àñnÉ׫$Á­YÏǽ£³~ÏpÛ¸èžËçýÕ.$ŽÅ[j[ò˜aAAAjšæäMpuºaÙࣶdÄ®2Ç·†…7|ÝûÛ)ÝÇ2b°à´— ¾uÀÝ[ªFAy‘jÝâaHJÉðÁÊØRW9Ö¬öp¶Ôöš3íÒ™Owû8ƒíy{ºÃÉ"o^ æ4]ûvæ, —ÎR×ÿ;·öW¨þ÷Ò°ÓJø‰"!Yooër¹i\*¢«ª¬l¥ÂÜöO_ðWØûA›»ïþà¬ü¼ý×>G“ŽH¾rÊ“jöo # Á¯Ò>{$§Õ÷§¼ ŒéæÉ÷_½«<ß endstream endobj 311 0 obj << /Length 3033 /Filter /FlateDecode >> stream xÚZë“ܶ ÿî¿â&þ`ÝøVz¹ugì¦É¤S§žä2ýPwZÝJ{ËZ+môˆsýë  %íj}Ÿ= ‚øÎâ*‚?â*•Wi¦ÂL¥WÛóȎv÷WÔøñ»g‚é6@¸™Q¾½}öõ·q|%¢0rqu»›³º-¯þüy_‡ª»Þ(¥‚øÕõFë8ø¾¹–Yð+þÓ~4Í=ÍÂ`Œ×"8”æC$ÔõFfPëèú_·}ö—[/G,ã0Öê‰B;êsÉ“¹ä"JÂX¦p‚$ŒbM⿹ëÛzªkäT]×vÔ|MFþ§z)ohôǪ.óëÅU"Tþ§Ú<ˆ¦°ûF¨PÄ‚vßœüXˆiˆäùó´—¤qðü•¼ÞˆZ|Íû¤Iò-V‰ËË^¿þ/‹ý²¡S‰X¨D|‘Jä¹Jž ¶ì²J´ÊðÊŸºÎëDËÔ¯;ëqˆ/0‚q’DZ«:Y\8Š/ÁùºéÀjÝ žv`õE~‘†:Jùïçü4+œNÄÑš¼TêÌ >³Îke“æp•_êú‹Ì E¦”2Q°*Zhb•Šx÷—/_‚¸pÝÁ·¦fn_ÕUy_uâ+ê–f·«ºž:»®=pë”^~…»œÆvª¦„‡«ÅkÅÁ‚ü¹êÿ2¶ƒÁ tOýÁ­î+¦@CÀïÜ"-§Ž)½Žã ¨MÉãußR •­¤DËééùß°È ££ø©Þ ¾Ýé-ƒÆÞ4œöÅ׫Ò(0¼ÄûvŽ]kØ)™1ú!.´nöœöX›­h’N:Û~qRXe}'þ;öŽ´©hέ!½AÃyá ÚAŸÄ«gŸ¼Y³ALÔ© ®?¢ˆ-˜p쫞㯕l­¬v¼Œlƒ TUsˆž§ /Še˜(Ïù®.šk¨‘BNqt…ãÄ3ÀòÖœ6eœžC‹ôZÌöjªOµiV=Båa–z {›+…B§’ºâ§FÅ:LҔߚ̃&3¼ia§jü0N0tí b[0aÉýn5J&:”òÚ¼]ÕŒ† ב|ĸ²B@žÏæÎ4E÷°j/ø’¥3v‚…äãøÇ;Û®*†ª¤ÎØ”¨3l¾ûé›öþëw?ý<±ý_Åp ñ‰'N=ù#èºG·ÛƒÛÐÀ›(jûtY¸ñÀáÑÆ¡-ÒÖÐK¾4¾=𠢊®Ør±B_x„ ”‚ûÃBÔížð`Ð&6hÍw¥ð 8<`_w¦ÐÅq@k‰\ÂŽÉÑglpU”ªG°‹s<ŽÃ£Éí.`–# SPºâÈ8¥èhàÐv,8„\&j)\Û–›ã|oì;ŽôÑ0ä÷L¸-z·tçV4 ÎØl‡~5n'O“ųøù°¨§hÒ÷ãÁFgã/]§`!-¢=ŒSÔÀô¹7”„4Ô%G¡¥tpäÕpczÖJJ­ ûnÀŠ–¹ø•“Ê„S9UÆò$‹{ ØQ¤a”¦àÙµ‡€!âÏ‘@Þ5竆‡JyÏÞ—Ž6$[!Òã´uÌ¥A›’qÒÐ-…,ͽXpӜޛûÆ* v(™h¤´f §Bƒk'úµº,ðˆ£èrؚݠ ÄЇj06¾€]&INn©-ÚæÇ;€gˆO#ÏÙ$ ˜¨ ‡–Œˆq¦.ºûªçUEy0}oîœŒŠ–\²@do¾ž“GO¶tj%§,U–g‹,º`Q} ýâ¾05Æœ_*l|÷ÃÏÔx絈½÷“±û¦›Tˆý¿™»_ÛÁŠ‘ô¶E]W¥OãPÐÅц0Ý{|Šn¨C)6·¨1»HìškaSwh2äÁAþhGƒ›£TB{sO¾åYœr_óV‹í0nA–ðw^p°œ‰åí§ §ˆQÈγü³É€xÀryQã˜v­kd.ÀÀüÀ0nÏÃ2âþŽú~ öLê°Ñ[ÿÊ(xoÇÖ1¥Žd(0Ãü)Ù ñRr¨•Ï r,F~¦Sk–ÚŠ“/¯ºÄz)ˆ‚ä†ByÐ uD¦såX½O¦7ذr¤‹»¾s}œ :`¿¥ö½Y»kšG˜Ð2Äl죧ƒ76p0 (ÓXpX  À2£µ µÔÂ!8 #£¦¢7ˆ±+µÞñ±F=a\—šÀ„«Ìpò¿Üï-ôçš#–ë „s©³¦ˆ-©®€½b»mGW°ÀÌÉxª¡¯s>lÏ2tž³="­ç}ªßªí8xÒv5L‚ì€ô“§$J±ýEöu;›µ¸­,§À° ¦çœ ÍÂ\º:ˆ~#Ä}`d¢5%h™U9sN¨û‘tnÊp¬×Ϧ¨á*Ÿ¸ãž7Ä,rlnO$ƒÒzˆI¼š‹›ó5w¡ñî=}kŽá¾î‰uÞs׉» høTÁ޶ôõu&êe¶ }j<6l¡4ñ¡ê0hOÜ]÷x/*·ÐÑr(KƒGÅ(ÌÁLbÝ­eFp?%•Þ8Òe‡Lo[P W²Ç`cŽ kO"m€ÓRHÎro$3L޵üâ»M"e ¯£PM%2Pr,°Ì‡õøݯšä¾±Ï}ÖÂM(7Å–/5úèÈrØkœs;v¶TŽþM€4 ?)ü:¯¶FRÐ@NQbC+‘¡C„Õ ñ.+0l KDçj’p |E39óï/¾u&pyÎ…· H—Ð¥EÉ´Àäf®˜Øµ5G *—ÃP7ºòäzGÅâÄaŽGˆ ˆ$´:“bŠŽ—¡ $½p¸d²‹¿ÂQR?%ÀèPhµ„‹©XÀÅTBònc«F)WÅ-Áv"]4> stream xÚµYëoÛFÿž¿ÂH ”‚£-÷Á—q9 ½k‹Ú"è¹×JÉ+{Q>T’Š­ÿþfvf)R¥Rç€Ssw8;;;û›#¯bø'¯2u•åZä:»ÚÖ¯bOí®hðÓ·¯$ó­q=áüêîÕ—ß$É•ŒEòên7uwõïèoå~°Ýj­µŽ’ÛÕÚ˜$ú®Y©<úˆÚß\ó@o˜E‡•Œê{÷K,õj­ò¸\ýç¾õHT"£_¨tàþƒæ©™jžÃÐ$p€Tĉ!íA 7??¥T"JL\ßí˜'ñHa’,ð48Õn·$Ì¡²QØ¡·=Ø#7Ñðhq £®= ® ä]×ÖDg}ûãÏDùá*·éÊîÈl-÷`Ð,²Ý®íj¢¸enÛz–ÊÁµMÿ¨Eæåƒ¾`ÁDd®^j!Iz~\%iTVT!Í¢vGÏ)ßem;·-+"-­î‰ÍõôDb×Ä1teÓWå`“‡‰WfýÖY" :Ì–¨MK:“„²á¥ :“Ú¦:Ž´ù¦tÅô.b>$ñÃâÝK‘á¶îÝðëM ñÞÀ’–Æ»®Ü¢zÞÀ³/»áœÛ¡.ùt}_Ò«²; Úµ¸{ÛÙ{Aw¢µPh[ˆ¤HI™­à¶ÛøXžD[ãO‹fA"‰O6îhrôŽxàYÕ¢ãEþÞpîÝÔv½7²²webaòá=:|ÚÙêè#ßwò¸Æ3 ®ý ÖnTîHQy"ò4›ÃÔ>Û-zJ.R²6ñµG N~]ô_©JÎäïjýqé`à&2—aÁbµ.´ºT. ©_f­$–óè€:“m`¶ ½Ïׄ‘ëŽú䪊Íêª3§¾wý¾*ɦk-cF' vŶl€_?QÈŽ‹¨¶ÖfÁËÁgïjW•<ù%Nb N$ÔŸÞŠœ@¬(ññ{o7`f¬ÐâHñ‡Ë<´=yCûÓxسä–å2ü\PdÄå; ÃY 9I¬Gx™9&? /ù¹ðÚ\5Ðð 0±Ÿ¡}âE®ŠË§¿Ça¿o;²kõ û9þÊŠv˜¯Ð¯ `XúÏ1"mïM¾X-Bé1¯®·‹©|rñ§ d±ö.ƒïA3Tày”<€üÑaÊ„œñÓ'^䯗¢–ÊÛ ¥°IÆüð+ˆ5š,.H5Ðd¥a…z¹TGiumt.ÒTÎüËã@ªhZgX"¡ÿà³·h>)T@}דÉÇeô¥­ ð-õ¸jG§CËñ÷> ½TI°€^me±£2ZFaõ¨;äcÕü¨øVà€}Açõm‚빇†sp;BÁJ‡6[ òäóX9]¹‰ÞóBû\Ö>3 ‹gç%@þ¬qa)‹°Lå´‚€RÍåÒk|#4«´µ6Næ©ôC×î|Ì H\_?ïmÓ“.hKèåuÌ)êæÚèXÈXMGëkÇPZ/Tk7×Y uâL`«¥ º¹Î³T(3²f XcÆ*¤+™³!õC¿Zºª’èZÅI ¥„–ü, ”åBF®–ï·©4/ëe6©•Ê$_ öRŽÌ׋ͭÈT6 ÊásËE¡ZCµ6Æz¸£Eg³ž™åvÁ<£5}ûHHR5sÚ³À±LR\P-ÉDž/K™È²ñÔ—|†Åçº~b“Dñ1 Ž ”ŠËIH”ŽŽOB¥­œ478)·¸æÑqqsX|£cuáÛFOJÅåíâµk%T¦&÷ãwmx£å{…I“sùêö wœ"‹ëhc2a ¥œ9þ]H9íaØ8¶»YšÓ§ïøvùøF ©äò§--D{Láþ†;ÁK.‹n|f;üÑ/'7ü¤ìÏ; ·ë³ßR0|ó&ñ_5“èÍ­Za,K¢¿¼{GÜ,½`á»wå…óJÎ?u·÷›¾­÷¶ëBcÉ;Kˆôág×ò-Q²Øt¼¸J‰8×ü³kÃÝødóÏ2L6žOÿÑ0“T{–þ—ž 3IW šýìRȆE–f í:™Ùešånnn¸´øÆ…Þþ5¡õ5Íè¶ã/ÔÝøÑ»zýÂÆ¿ä¢Ñ±7:žw¶ìÛ¦ÜTì”—œö™ó¥O“ƒÿµó_Ž”—r endstream endobj 320 0 obj << /Length 3188 /Filter /FlateDecode >> stream xÚÕkoÜÆñ»…|0çXî‹ .¦v~*RåSS$4§#Â#’ÙýõÙ™]>¼')ŽŠ¶6 [gggwÞ³W üW™¼Êrç*»ªN/ n¯hðÝ7/ãíq·ÀüóÍ‹?¼5æJ$q‘âêæ°$u³¿úGôõ±¼›êáz§”ŠÌ—×;­Mômw-óèWüÓÿÜt·ô€Yt¾Ñißüu½“yØZ^ÿóæ¯/ÞÜx>Œ4±Ñê‰L;ìG8ÏÓ¸Ð6ƉÑÄýͱ.R•ÃíùT[¶'‚ôä ˆ¤+""V©„uíô]Å8«…„Ž•ô8§‰~àeÚ±§Ñ;Ü}äV§ŸbžÛ©Ù½³s&~=NâðeQÓ𮦦:·å€ÏrA#»LƒÆuW!Y´¯÷¸«öS™Ã@ÅÂâWRi}óv—Ç×;£³èÛÂ2ØÊö<FÛÛÝTe[ÓëóX‹É4,GzÉËçÑžv¥²ÔÑ#Īìó~h¦š`Ó‘I{Ie()„웡®¦ö!6f  t©r,‡²‚s=ɤ‰n®sõôÞš™ÝÁ‹ˆƒRG ?mK OOË””‚fó`´ÚŠ#òLÕT¶ô\v{:àˆè}¹wê9^ šW•|XAqÖ¿œAR¤Ÿ&ÑßvÍ¿H}ÌB} Û hG75}7-=Kc ÓYú q8¸‘%)b™žÐ_‚„ÇxTä4‰Þ'ÏoǪNœ›M8CH8œ ¥â$1Ä3܆v8Ç’Ð:$kyÉøË¹Ÿ\PQ™Œ³|ã8È¡=€H)Chöb?¥Ð…#ãVÂV§†z*QøZ[µ^ákP‰šu1–º`1–ÒW|­j®©ŒÇºOˆ¬CÇTa' Uwn÷ÑÂ$I žîZ F‹¨9Ô’Âd7ºÅÅ,´§ßª?AÌf ?X{„`Ã_ëbxöÈ éøy<kJð0ÚSš‚Âa\æÁP²ÑÒG¬’yö¡„Yd6ëYú /&]™N¹ßSºð`„„ -3ÙBßìÑ¿üA(ýþ´?9ý|õõË¿…‰e&—±–"Uô–›âYŸ¬ã@hÛt ¾`R.ãmw†üôp-®“GK;è+¦ïío©‘t„ZÆ Hee C š=²™zŸSÏ8íÙåKSÄiâMµaz.–*Ž¥ºm(&°Iy® ‚fmu.DŒN@lô"ɹÑWˆô5Ó.Ob-òµ5ÝXkrëÔn冩:Îï0î4”•¡c¸ ?^§jHrDèl”\jNÕó±CâGkN`ì¸~?…–Ú P•§ëÍümèÍdà ØÎ›÷wu‡ù/G!¨7T" óUP°&Îd¶•kºM½äµJb‘Ø,×D»°ªF.žNR%IlÎ÷çÖûÍÖþ,|gÉçåÛÉD†øÏÈxŽÁ^?+ã™Æ“šûP‹m£ÏåäA ¹T}yQõ½“÷~QË¥ŽÓÜüf%ÿûJž$ÿieù¿Öò$ù¯j9g²sÒ#©H¦u ¦…å6’[|Ê5ôÅ\Ã"Qððà1ÉDÙvÓ²ÿ\±(>ÿª00úãë××Øíº §-³Oõú2‡*¿Xyý¯_ÿéÙyðF ‰˜›‚á«wcßž±ÀUëa°98 ù, Lwÿêø‚ ßÕ-$T¿^œy’û—Õ;Eë“Á¬VPT?%±•Ô«ç9%Ž@I‰ËLxQ=#¿KT2ÖŸ *("¡‘i"3]ïôJT«°óêl<1Iô¶i™ÚgÖ ?£ôõ0ÒÃaèOMJË`pà>DVìˆá&HŽåŒ1.ibH(±`©4¤­Â€oÌ„û®Â%^p±-¨4"΋'&¦ð¾­l[JgFf£'G"tú¶£üí³˜X9-?ª7ÍÁ]sÆa’> stream xÚµÙŽãÆñÝ_1oæ £6ûàµ@ìul$A¼€ØFÌ•(‰XŠTHÊãÍ×§®æ5ÔhÖ»ÁbŸÕÕÕuw¾ áOß%æ.I­Jmr·=}Rk{¸ãÂ?ÿü…–q¸™Œüæí_}Ew:TY˜é»·û)¨·»»ƒ×ÇüÜíýÆZD¯î7ÎEÁ›úÞ¤Á¯øÓ¼/ë÷Bc\îupÚ•?…ÚÞoLÂhgï~û—/þôvÀ#2‘Šœ}!Ò~ô 07± #ǘ—5 •†Á¹Ê·›=û#6$Y°+öù¥ê¥·–a?…Qø â KÄÓ%´MUF€­ dÌ H%&ñ#¾PZÖlø[Ö»r›÷Å“3R+hº²/›z [(ìŠmyÊ+ÙLH‚¦$ª÷ Äoy˜Açt9-,Y!¶w휊,ð¶JGšñüõ>Šƒ¼º‚¶:øæ MfƒrÏ_‰…msºßÀçõLPvøuÁ:Å\ «9Oú¼±ß3¿lvÿ~Åsb3;ÈP8L™²/«Bó,š5šÇTˆþÃC(×k8Y«’è J+`U&Îò±¬*&Á¥Þm× 6yÏĵQ °c!.ÏãÃôÇã³îéñÁ¤$}…Ev<ôâî€mqÞ1oó-J'#ŸL‘7&QXìçmÓ«L©l Hé©–ÍNÒLäÛṬÀÒ™²#°F—h5ÙÌ Â@íÐúiÛ¦jê5è&U.F4®Hj,4{õb9%â¯íÞXÛx¾{s{÷ŠÙÂÁY$h0ª$ÍúÅÀi 2Â…+Í©ì¹Dú¾—OÜQO8F&2/`Ï•F·* â3Óf·Š³V.ŠÆ[l #6ý'@ˆ¸9\…â>Êù³@©? ”â%t#cyXÜNè\¾+‚GºŽ˜A¸Bƒµmщ]RDGÙX¹DÏ @Þ÷mùîÒ‹va]G 'ü)íeßy]æ 'Èô`=DØ»¢XZ|ƒtÇú.Ž•‚fD‹¯"èS¨·•6dúç-SÀÏßL¬øËeho?~;"kƒ¿±9dÌ¿»O]д§¼ÿùÁëe䇂+Æ-÷áLœÎöqÝsñ£o`½:Up¤*uNTGÌ}ÿºO-© eA‡æøh7— R‚’ÅC/¸²ÍÛb©¸ò|Rã†>¶| /îÂR6X eC…–W!£íÁ¢Â/ðÛ0‰õº& ¾+ÁF> ™‹ÀÉ=Ê+Áe‹+{Öyï ‘›óæ6ÖvqRtFÕ%+ÚXÃxð{.ï L:‚«(ZcˆgàÃp©E—ÓDä $'iâ#Çdu8¤Ã x&ØA2’ ,Ldbž£'_ lx-Ÿ Ûq‘Å‚h·Fý:•òA:(aOÒu–,tDƒt°ŒÒÔ{Gõ­9úuÌG# Ø‘UîÊwUÁýd¢ ›HD dZ e '³%,|à`\†b¡¹t@¸ÎÃ:ÃõM»7I&°­—ñ塞 ½jpëâ3Mú™&Ë`¦øÐ|n …~ã+Âl’§ÀJñ›ì©.|¬kÒ,ðc%¯K| )aáhd2iáé(€{(k2ܸåR—½ôÕé2¨a¨åüyĦ|>‰æ1zN®J¦e)OLá sô°„[…u+rdt vÃüìFÚܲçï(¥ú©Áîmã×i(÷")#lÝ9h,þsÉ+r±ðdJ™Ý^*™W]#8Ÿ«²èfÛ•.ÉSp£ó‡•SÙu_I U @á X•Û²¯0¡Ñ»¯ 6À\Ïy_B¸&t~ãØ6—ÃÑW .bmƒ:«-9mlE(û”¢[n‰’ØSÖ¨,¶\èdàÜÅŽ€|œ’²°üjJ 2*ã°E&êAý_2QŒŽDS&E¢©5ü0Ë©_––šl$WcSÑñ |í $„è +æ{ÎÞBϹ-Ù]BA“Z²¬ «/Á^Ѷt 'OE×ATôêJÌšÎÃr°#á&8ÖÂÊžâ,.wgPûýwéâBïgî1xðÅJ‘Ùé[U ¡ª‡5>!4UÕ\ÇHKßT«®k<Íó>§bœrÙ b(¿MpÑÄâNdKŽl"Iª¯TÅbÓ£{:˜|Á ‰oVOažv:çŸ w:ô‹d·³á)„7É$» Æbmßx5¦“Üš3YðîÒó*D…aY(°o€]}y’¶á` ¼8h7ý2”tSæ(1w\fÏ$ÝJrjæ,tsß§¼¬ÙÈ!H0ë‚ ÄA© µv6Â[¼ôãÏQï̧Mš^pdÖ“$*6ñÂ0 Á]„ëa ô44ÝdRkÏž”¦Ž¢o ü'–Ñ÷ͱ>8ÇuÆè ¬†òpY†Æ¬ß*D‰Ò/¸R1Fev"޲ðœKVH£'·)+Iðê»1±„ ÄúÂÜlá6Œ·[±~"çØÆÞY<‹b°J‘3+f […š6 ¾/kº¶Žõ_#,´EÞ5uaÖÃúUðZòB7É`Æ´+d1r„áKŒÐ´ï}f6I(ƒ67Àä¹b~3š0JSî¸IØ Ó—mHŸ¸™"hä@BÒ¸±øÒWº 0H¼- OS#‰Oê¤dTÍœu㘼ò@tž0x¼’ð;Œ<y-£šýj¬D îs®vÔuÑ+ήß!k¥]rÝq'uÓ«‡5>‹Uª“OpáQQ$Ið÷=ozÛ\ÚŽb— ª;ò®£L2–E+%ÖÖE#Ù¼ °‰5™3Ñéx™¥'Í| %›‰F½ã‰ÒøV†Íä™®”9T^SG±=“½D!90ÌÃÀëwºà³$±¾­€R>÷4í–,Òn阌Þ5«\eBêlc¹ÿ*¶>Ÿ‚úÀ¾É:€lF…é")ò̯%“½Œ:ºµ)7’ö:-Œ6iBEoe©Št<ØÞ =0SÝ6õu‡ Qãûv‘ÏKdñåÎI®N¤0\,Mf0¬Ç¶ì nÏùÃô$xœkà¾á]ªLœyé(¤À^q÷¢Áf°›œš€ò)Ù™«Ù.~¬„Ÿ·Äp– yÖª|/Fß&ÞªÆê˜ÓM´ ¼Æ`2’ìòîÜ(‡œL!Ÿ«£ÅMÌÊs oq“¹ÅM&—.Pšvr`€Gã…:*gÏS(i ú¤+V’£ÂN_{Jf.¨rºtaÊ€2” o`:I“bšüm×A ÿA^fà3›Fš}ž‹Y„<3ï¸wz/Æ-L¿Ì' 2ûÜ•…u©²Qú‚·.&ÏTž±€åðY œçã9”ß{ ³qQúgÁbϼœ˜¾tÀÌuÓ^¹“ÉFáêLæ¥I7ܘ,§»^mÆìù2;‹œ>ÀÞ¼óiûª<•~„æÐxš×÷!É,ý?Dk¬"äÂäeÎj”¤£!aå3¹‰àWGÚ(kÒ'yÒsQR3vÛÞS"³®£Â¶é2t…Ú‚MBÝ•;ÒòØÊ¹*±À2x·‡6?qeÌÀlv«y|ÁM¬Ž¤ŸNC&¨]±qFkFå©_ÚçKšÊ¿Œ²“3ÀVñ§š± >yŸ†¯¬(‘ŠM˜9åh°¥Ð»ù Bë¹…¢cZTïÊ3¬—²;r‡Ø†ñª `fñ> stream xÚ½YmÛ6 þ~¿"@?Ì7\4½ÚÎa7¬í^ÐaŸÚ6`07QoIœÙN_þýH‘vìÄir‡ëZ ’(’"ù”ܪ‘„¿j”èQ’‘šd4]_É@-#š¼þùJ1ßÇÎ÷WßüäÜHI1‘5ºŸwUÝÏFD/—Ù¶öåõعÛë±µ.zµ¹ÖiôŠòÍ‚v˜D»k­gù[©ÌõX§¸­½þóþ—«ï[;œvÂYs¡Ñ ÷ËÓXL¬b!%ëï—,ÛŠm´Ä⮘K…3N ãß™§§ZÅB%qÃ3Í6¤ôx˜D|®ò3šÕ¥¯ê2ŸÖL%St4-Ö̫۬¢£%|Ñü€?ÞóÑ®|ÕךÑ0õeåR¹(‹Ý–££q:±ƒ˜)#”Sd8êó«Y%ÕAprÐmdÜDæ¬þw——žw²Š¨Y¹Ø­}@¸f 1”Ùfá‰GÒ68TTy‡ñDÎCÒÔ~² øß_;P³Úy>£(‰Ñ“±ï²ÕêÑÿÞU5Û»,óÁQÉ.’‡CG›ÉÁÑ@ëÝ9ü%%–”1ÈÒzœƒ–Y>Íê`®I P¤w-6o¥“ü(Ú 1é27Ъ^‚#Y=”—fb Ÿ›œÛì ¨æó¡ä´F$©k—€XHk‘h×ÏL"ãl”/6EéÁe'“èµ_û^(ˆ§^fu3ó4é«àŒ «|ÃlYÉ3¬TTOÃtF»U•uŽPb\˜#O±¦E{èÊÏÙŽe¶™õF¦n°›l VK0@ŠààÔû7-‹iê.+ Ó e£2_,Û 0ÁT64›1t†‰L;ÍÆ$ña±e›U¡=˜$ÁàVZ ¥í™>0V½>„ÚC Iù‡RŠŒ ¶ôˆÚÇX¦°¿Ì§è3­CË®ØJÆŸ4…T% Y¬¡-«xÒX£n-Vº֫¯HuñYµVH© }‰VÌãÄ«ƒ§f$Õ“Â)Ók/¥ŸûrDC£ÀR #¢®Ý„»5¼qž±î—j\`·E!’Ü ë¬¸Àü½ÁËå„SÚÅ:yP.°º¢Næ§y(ôû+?-0ýÇVËè7(§j²3k‘¦ª_ŒMbÅÊa ÜëîŒ\7‘F1Ü N6ÝBöZ”â>q°@h+Þ˜%\zÜÊ7ÜœäŽÙÑp$¤ž¼`Û¡ä®ËLÀ­×Õ›|¯²¼JMtCMçSxfíš„»¿Ûè]`èýÁmÉ;ÀÃj¸:’ç$R/ô .ŸÓi=ë¨îïLÛZG®ÓœQ3½ûèó2ôþnÿ¥œ#"¡ÅÁS‰ƒ è¿Ú%Ÿ{ìYOÒ3MÖ íÒ^“E¥Ù–ÏJ"¬ƒC8«ó5> ÂÑÌ]7¶ìëm]k|’R§!ö¬òƒŸ$P"î’ç”àþÝð!_­H3#@©'!vÒëm2x®w@±q´â;®îí£å¸C ¡—ûÑ*¼ç žT ¶TEoŠ5+ð³õ6!qê=ß“dgqi±ºASHͪ^ìI²³‹ctZ$…i°Ò°¦—{’ìlãbÀ¨Ya¬…´¬ê‡=Iv¶q1 ªZ¸zøˆgU?îI²³‹ä ÕˆØ”¸9¨ÃbWoñ+ø¢¢µ×ä„Ð=h¾î ¯nÕXwInSK{ AÝÆ}!}ëÆL¢ÆÒN“R'JÉäð&®3ÒÀ÷ŸÖi?ãƒ?CX<{†vÄøg· šßÞÝQeª”ê 49yw÷ ˆÁ„þžvŸ¿«ŠÕ¿ CÙ—%~à´9aæ?~¬nˆúÚ¯2øÀ¿T꜓î¡Nšc'åÓy©åå`ÿ,Ü_ú4Úz8tú4ÜØ ýäp›ìì¤9vR>—O÷CŠÛœ†Ûœ“8‚o‘cC.ŒƒùrÅmNÃ}ÖIsìäðý÷(7ÿo¸íi¸í9‰#¸ñ¦4ÜöËÁmOÃÝþßÃ"\ìà endstream endobj 335 0 obj << /Length 3220 /Filter /FlateDecode >> stream xÚ½Zëoܸÿž¿ÂHPXF"V|éÔEÓC“¦hïÃÕŠ^¨¼Ëµ…Û•6’6Nî¯ï ‡ÔË\¯M‹oÎóøÍpùYÿùY&β\²\fg«Ý³Ä¶¶7gTøéÝ3îÆÅ00žŒüóճ߿ÕúŒ'¬H ~vµ™.uµ>û9úá¶Ü÷¦½ˆ¥”‘~}+¥£÷õ…È£Oø§ùµªo¨³èpÁ£Ýºúpy‹<ÑJ_ürõ·g¹èÐB3­ä#‰ö£ïSžN)çIÂr ?e‰VDü‹ HK3½x äp ¥ËË?^à’‘b‰BÂ`“˜KÆ5§I¢î7×]³=ô†j¦m›–Š—Ãô៉Å+jýÉl˾úttŸÏšíOÛÇ‹!_¼Ð_Êñõ‡K·…>5C,OŽ7@È#ÏAÏ8â_uüÉúÉLÊûL&ßËo¼mQ™ÚÿåË—@i¢“èmµu =ÿ{Õõü9UÖÕfcÚŽ*›¶Ù¹Ò|´xŽ‹/•T"æ)ã² ý~< Ú)5V‡¾Ã’ˆš±ÑîBË-4,ETÀ‚]ÊRÚV ¦ÒÂëo - (³]»ýªšZ‡î=Ú‹¨éª¾jêŽÚPœ¤N#AsÊzMí)}\]¥XÅr=%X| Áx±,2&¥˜‹ÍÉ’û\@›B.²"ÒT%ª3à‚Á j…æÔvô·UG=whZKü󅺪ž¾«f·/[ã†õ·`m/WíÚm´i-ôMwK,7ßêX£J³¡¯±Ý´nÏmU›šÁðp–gøld<÷Ãî*"HùT–²¶ë‘“\EYzDM ŒZjµgHÇã$ÇŽŠàxð²ˆæ‚‚Z¶¶_¨›¸ì¸jZ7.®^“?ƒvË¿ŸàXf)ÅIáLeê‡1"¥¦¹œ™¢7(RDæãH©/·Æ:ÚžÚ7M»£’e¾Ä@,vt.Pùoðz²¤vÐÝÍÀfCŽ;þ7~UÄ_óXL›d$п`Ÿoà¯Óù$ñZÇ®‰.}(†O#ã hñtœ‡ŽÃÉ*ƒÈÓèÆ]`U];µÀ® «@Æ¿‚ÓXÏy]²¥`K4áéÈ–%á’àQWÕ+CÛî®úŒ¢m(¼¤Çƒ2Àtëí!à·ñ«Ý€jAB •gòÉu_\²©Åj€N¶] !¦B!weháÒèêÖ±;\åüh¨sáh;…Çßr»× eÆæ®/ÛÞúdì#l§ÝµP¿`išÎ¥y–f,  Ï`íîõ`r°ÛÛCçÜ4p·ueIÐNfYF'l×ÙÐAh²(’q€šÆëÌÖ¬únzvóéÌ™ ç<Ð&,tJÄûiWš.ÎHûýÒðY‘Ð(àTšÖ u”ëª`kXL0·™þ?@ò à¾ Íã‘hµ.%Ó"ÒÂ"7°^Þô¼á{!0$Èq.X1b¢# ¿O@fºÕÖ ÖèªN1€¾ˆË%íàX•ž#Ý‘bbêAÔxàyÂ’¼˜˜'KO5øJMÅå†þQQðˆ¢YÚp#àl+òit×Vdv°R’Gâ Œ ÕÊãèAL†¶wâ…Ò¨ÙÛ!OÓz80`6Ä ‡ƒîÃQ8,¾-ÛCÞ0=éyiÔˆ³ ‚8‹ä¿€-µ˜]º>]ƒmÍï£=w–ïQXy>Ù*f·ß6‰A(‡ÂñcáÊù©cý…šë¸Ýg X¡£?tn¯`ä–+&×å^Jðóã,æÕd­ç z°jfØqÞ .¯o«UoÖ±ç/ò×W]S#jIDôö¢_’(¸…x‚âÕLÀ„çF #%ø—b7Áb–‚Ú f3/+dÂx>€% ÂYˆ³4=Ô¾%£— ÕÂVBýB‡X©„tTˆ1öÁ2rdsMÍÈÕÖtó¢±î¢Ÿ“³ Š œKôä€0nÜôC|yëlËx¢è&o©·±p »a\ØH€ŸÒ*}œöfbhjOŒË:Án%5üfZô:‚.Ò(ï@òœI±H¥¾k,Ñu¹B&~¥šu•¹ðÁ>êi ÆÐV8íäKNQÀñ hç÷ee¡XªùsS§NÈ»¶§ü¤>hT2ðfR>°qtí”R @ZÍhÄ9"³/'@"¦9êóÁÈŽÁ¤eèÊD‰¼@>¾ $ä-"š&Þ©µõ¯åöD2Þ¹M—Rè½ÆÔ+V®Žú°BÍéii-Qö´ä,KMY$©ͳ%Ȳa‹(ÎÊ{4Oµ‹÷H­ÜbÃÐPnÛ)·zœ»˜Ãi©!DybŠ ž¢˜ÅÆë´j,!kã“^ý¡­Íšjטû2Ø*ìÛæ¦-wóÌØhÁn \ØW9ÛRÕ~Œo±IèÒ*45Þ¨H–b&D3Ha¤ Ô‚WUcÜÿv:ªQ¯CË0]Œù…ÿ|Ã*ÃÁÇ»ÇÀØ“«üõ»¬²y GpÖÙQš÷Ïù*¸¾ †¯ª <¢ÐI€up/ö)šRBiÓ1Ö÷’—ôVÇAåÚ• Ê»¹Ä'ÜæŸgtmºU[¹—SÂØâÕòAž«á1´Ítâƒ<ÓÐÇ{1@«ø2?o™>ÑûùñdÀ –Û,~aäåôùŒ/´¹ø/ ´y_Úœ/ôédI½(8xe1£þøÏ üè´.LKÆ£(÷©„ƒÙ»âÐSJ A阎;&…B•SzŠ €Èø»ž>(|=ußöæ°_–Ôäi]Ô2/4Z»rç,ª‰BúñPµŠá^0²+X®ŠG¼jñRÆñµÜ¦_G3ùOï8“ÈùÍÎù±YURLß¹±µ\­Ì¾ï\eÛ5TÚ6ä’ÁàÚɽë^55±ŠßH¾ F½ûñ_Ô‚ÁÙºl×€ã4SCìFôûpyôc"ÜÒøA(<†pÁ>ºØ/=[`Ñûj—¡Æ& 0ák ÂO~ „H°?ó¸3c–}Óv—ç¸T5þq®ñwçáÉŸFp¸™Í1Û€g>ZÄéž´Ïbcutã”%Åbc ƒM¹öy%ü޾÷4mw9tîWIêH¾j²øitÁ‘æ“q2šc:ñF)ñ"G£—'¬81C£–hL7A× ¦V‹Œ²Ý4”’ÁÐFá 6Íâ5lX—Ah5EÔî8 U'—n5õÐàÜÁMU×¾@›÷vÍdB ÑTî¼Þ¾ÕµPzhwð† 1ˆs? 3¥ûéa§Iô|u·˜ªiLÒaÍ:Ñ Ë|4h™Í¶JJÂØüNÍmåžlëÎÿÀÂv´Æºé©õšò~TÙ·feÖö€e>>GËi¶}þC(s5xƒË`a|9È{WÝ`Hq92Iñ7îb>£-óðð Š6ÌLŒ•%=‡Âˆ2ø¬&:Û›®7Ö‡HÍ Zò”ßLŽAz7ŸLû©2wA¥Ê˜ÈÄ•©T¢!ÂAI¼†Ì·%‚Z–½ÍØ´…€Ń7ÀWžÖ© =`LÓ@´›,œdÀ§¢aQ<ÂÇ´_.riñCZÀ¥Ú­U\%YoüAMðR.Ó$øžÅ! šæïq{"Cº­mdw¶ÄŸ$ôÜwLe‚~¤!/–Ñ793,¢F9ó]°"[ž¢õÒfÍ<ÂûÏšn³ endstream endobj 339 0 obj << /Length 2785 /Filter /FlateDecode >> stream xÚ¥Yëoä¶ÿ~…¿Üž¾IÐiѤ-‚hôCS º]Ú+Ü®äè‘óEÿöÎp†ÚÕ†N.) Xäð9ÃßûÂÚ)êF4òæþár«ûýÍ?«?Ú§9Ž·wZëʽ½½3ÆVǸ›»þ‘ÈÇ®5Û~ S}'¤‰Ç=“Þa>Dß §§vìneSd5ôðß)c*ãnÿuÿ×Wº_om•­­ÑŸÈbžý#>=ðék%­É|*W ì!ŸîöÎ:½áÌ›•3o™3h\p=â Ä4˜³ XF®å+nîTSK/éØûÛ «á1ÂjØG9S}èæµÒŽÊÙê‡[ª8NJ GlýL#þ^Nû.¦©ÛM4<º§'hú*î‰Â{šêiÇöÄWt—WÔÂÔn-èŠý~JB)qcldÈ3k@‡’Õ7c÷Øõíñø™{ƒç‡ê/tì>îº=\öº¹ÓVÔÖÃSI]KK{ÌL´¾Ú±#µçCbZËÜ»Åñ‘]OßaÜ'âlÞaÛ#µX¤Ðjé3uóÒÎ$δ;ó©Ã)òQôáaŽýö4w»]Þÿs`öãÔMubK0?üÂŽ#²`Bx ’l<ÌDo‰Î¯ü‘ˆSwz:F‰Ïmîzr NË6{¬Œ¥§°ÕWq¦eâmÄ0ñ~Ì<ÌA`Ã)%DU{Ð~çc7Ͳ-k·ÎÚ ÄdÛõ½·‘¦ÖÚʇðoAËŽ ˜„ˆ&a"râ¾ë¼éû¥¹=â[‡j˜e…þÒïÖqŰYé+%€„0<¥çÃÀ5oÔ‰_jÀ›ƒ¸æøy$qµœðÿ»t:h&p7áóCzÍØo AKue+•y[’:®rµiÂÅ2Fׯ)¤jï­±Á [ÂÚ^ℵV*˜ítÕhد´Ä¬K¼‘Ô38ïuc¤Ö†;v]¼jpä”ÀÅ!XЇ8^bŠ£>ÖRi)¬SÖI*]!¬+”3#\ðR6 ÎGQiÖ%Ú†"1ÚÂB¯­Uªx/%Ö%Æ+©m÷iëu(JSÉu‰ `*¬kLb4Bg›+J­+\#Œ„5À³6Nxh_év`éBø %藮Ȉé|èsé^¶öÊçoP4–NiòÖsJ@XÛG%2§ØÄè{™s„©\€sÂfï8~Ô^¬MàŠ&y÷åØy‚ðXJ}–uR¼·¿#•!á7ôùNXñüYKƒ¿e=¢,?‘¬Á£\ÄÓ`ô«¤ oö!C•ÚaBq$RúÌMêts50£ÓÌYŒØáÛž§Ã3X¾lÏW‘[IÇÃCÑ›º‘«}?ä‹£ªG¶¯éÿžhIôØ()-Ò“‡ðÉCD^ƒ±8~7QëÖi]ŸÝÆË¾hÏÏ9F»÷²ú¶ ÌKif2&aóâÒ½Ú¾fÎf„¦ýFãsÜ-˜Æhd¶!JîíÀä]ÊO'z ü»ˆ:È•¤Xõ$ËžóoŒÇÂ^äQ >¯ýÏïúßJKØÁÄi›²µƒlK‘‹”õÆ3o¤½¹ÂMÙ2‹Š©?¤¸i²Ëͺya¡¸zê‰ÆÈ­ pVÈœ‘à‚¸A¢…!r¬ g„¿|gw6oJlèé Ѐ\ï‰|ÊnfsOi1&hPþOsOíû,_m6•Dú.+$r×_̓¬û”„c‡‹Ç£4©C¿îJO‡4¾a_NýD "øùÔOÕj-ä»±Ù›ãóœ3@UCŒ¹•ZÜwszh)X‚ÜO<%§·zg|Q8Ê«?-Æœ ¹l3ßa4’4ƒÖíùÀd(/ç•ó<‘ ¥)ó3KËH Ý_"Òê‚[¿gÝ2¤íÝ)*Úh…õ°²K!nXuÔ\( ¹Ž^€’XP†e·ã8VÑ£À1ñõ“°RaO0<`t×ö4Û©Ë+QÖËÈS°@RÐÕØkQ• }Ö´6¶s»n-… õÒ¨¬Ë#-MÜñDNoI¦D¹à×çÙIŒÝöc¤2$^„¾ó"4¸J&?КµŽ2Ôt XêšIB½°_gÌ6ý¼'PÅgÖ­‘Qøå×ßÒÈ2¥¢ªhÈ‘3ÏЖÇÇ8Íç-/옒qŸ«8S÷.Ã? ¦´Ë<œRñŒðÜM—*r¡…õ#›wy†ÒÁlÁWîÎ &&]s²zÏaGO]ªÐuq*F©¾rõa‡Øî‹ÙÕÁ¬Á"¦°è—•kJ‹I_Ë .BKíØÍ¹U.peð[ oí4²kS#eO,dn͆‹ä†ïØêIqå–uõ™âf*|Ù¿–ÿÕì1ƒ„öÊc>½¦é¿§Ù_½d„­®Åz±×èb€Ï Çß/”K¾'—È<¶=ÇÐ ñ¤Mv(!Jt—Ö½=û”ÃÈûsÐ =L%’Õfõ'•M`/úðÊ}œ?ˆõÐäY{FºÑ¢6pÐVòcü¡Kéøv9LÃ85´Ô<” F1n µ9#õ§J§Þ®²X‹hhF´ØA`á7Ù).Xöí #Šm‰” Yº2ÿºÂõ•¤à¥r*){J#·!ì&jØX6&ÐxÁO6«…9©âа“…%1˜–Iú= =1<'êÆs9€¶Ž{AæˆéÌÈ¿Õý|ZNi±½ ;C^ ÷(Xuþ.Ø_b‹’h°T±9¦‚ÀC²9×Òܾ)BÀt4E©ºØ„œƒƒË|±ù±„ròTƸ:”Rs ¢áà\—¾:y½íËÕü+®_´&*@Æà.Í'˜ *Iù\’â÷CkÇ8y?eëGÑìÛrBI{ÿßî_P{þÕ¥âO(âþÈÒb‚oR§œã²R,2¿1dŸþ6*œ3Så<pxX@RU#Qø7@ùKe(þ~‘fò’ó4ɼ@ÿòHúUÆ2äg¦L ˆ&˜—*2˜q1BŽËLÙ ;±D(æÃ_ýŠ|˜¦sVVJý)×êøjóxáM×è:§]ÃøžçuÌÂG l©s¹§dlÙñHÀß¾ÿ›–åú endstream endobj 343 0 obj << /Length 3363 /Filter /FlateDecode >> stream xÚÍ]ã¶ñý~Åy8-pfE‘¥<è%wÁ‡èm‹MÑj-z-D–\IÎÞA{g8¤¾Lïù> ¬Éáh8CηÄobøã7:¹Ñ™`™Ð7ÛëØB»ÇüéûWÜámq3Ã|{ÿêwá1ËãœßÜïæ¤îË›¿Gßî‹ã`ºÛ"J¿¾ÝH©¢¦6Û¡j \WéiX4%dôcÌ¥©KÞµŽÂ°7´¾mÇ¢«ny( Ê@t<‘ÁÙò~%íÞö}õaÓž)ËÀGT5ÛúÔWÞY ›Ó±`¬½xÏfLáœ:TŒWfbò=£¶Mõ‹é‰SÊq°Ýj q[«K®}ôL];G¦ßGoÀvÉüû„y±{$Ìm’‚¾©ôŠ›Ç° 5·Xêg°Æ5SÐ àUÍ€t ³ß]CelÐ^hL]¼ÍöóôœZå Kb½T+kU9v ì"á$'ÏSÚNrž9Û€óü6òå®#3_w%½[žu•aÍ9æÁvÎ,šÇÍÆ=h­óÌ}X­>Ùê0ϬߤlÒçÔ/T‚``;LëГº¶Ö }…8wg èyþ§ý·mëÓ¡ jB®™˜ªHw‡Oû¶Ûèæ=+é} x=µšî!’|¬í’XØVÚòo±›ý f¦´Â†©›â”üËeÉ !æÌA|Âߘñ5b0á±Úß Í†‡²Ü·Ó¶Hænɨ㒭„ñtµ£d±í‘\í6yê*jÍ,žìÍÆeËb9_ö^½Ç”zž³ãÌöDµëÙà`jo㌠Û¼Yýí6“Ôk…ê5ãgŸ ´pX§~À”\f1pæißfØ%ox8vaÐ ˜Û -%ÈR¦öÇæ‡kJ¦M¦µ èRSެrµ«SìªÜ£-oµ/oêÊ[ùò–Zî¸4+oõ¥ïUD壾¦¯¡Ø(á 5-ÁËÅ*†ÿ†ÚVsþŵ­~¡¶Í•þ²Úv3ȱun¿\J}1ë¶ :^ õ]¢þï/¨&m=î‰.ⵯu•-JçÖ{}e:*‡lו SQîšYû¶«~qÕjQ;¤âb'©u'vã·fÆ—ÚàÈžu߯÷2çZÂAÂ1¸Š:KÕTÄñYT˜%@Z`]c‚E½æoà|"ònìZ$)¸äýº¯køòó¢‚2z„·± ÛJè+Uá÷ÌYÆx,¯±åÄšè¬ÏºdÊ7Õq¬ŒË/¼ê–‚I9õÿzá”FeÙË/ r¥ ;–XœŸùN$ŸÞÐpÓø¥•† Íô¨kÚvòw§šÆÃÞ&„ZÚICƒcÑÛ÷C¶Ýn+1Mßg¡j»Ç·þi›ÐºªÚ-M/ôøòÀ@ì[ÖnµofFf qEí:Ø$Ú2,è›·4æôvØœ¿ɳȶ3Ïd6/aâXÊè+1ûK “ò!>àÄWp0nxìÚÇ®8ô„o0øæ%£¿¸‰n…ŠÝ‡[öÍÍàZtBgLÉlá¶úç¦=ö•¯ä‚‘ÒKqåg{ù<"ÐáÙé>ŘYQS~ÑôQc>¹Þ=½±ŸÑ2ÿmë ̼c endstream endobj 347 0 obj << /Length 2068 /Filter /FlateDecode >> stream xÚÕY[oãº~ß_áGˆtÄ»\ íÙM›"Ý,N Åö<(6c µ%C’7góã;äPåÐv‚nŠÅZ¼Œ†£ùf>2Ëá™):SË ¦f«ý‡Ü޶›6~ùËâäRLÉ?/?üt+ÄŒäÙ"_Ùò9Tµ\Ͼ&?oËC¯ÛyÊKÔæ)ç"¹«ç´H¾™ŸæßU½ÁÙzÝé^õó”ªBÑ„ó_—ûðié×Td‚³7;H¿²XÅ*£DðÁb*³ÜôŒÅjž É’»9Iê9#`&ü f*1š ÆÁ׫ðëóYJ Ê}üã???|y¼{t¢2å"[`%‘—(>:LOÒíïiºÕ»Ãïé7h}ÓmW5µS5ñyÊH–Ã÷…ºš6¶hDpºè×ô ß“t‚*Ï8ø'ÇW>ÇT‹LQ5Hüú5Õ1=´È$“ïÒÓýzŠ@Ïí²çþé¹ûAz¯ë¹»F ä)h êãuU?Ýßý=ªñŒIæµL™gáp,#‚àÜ×ô!º5ÍAÁÃã§/±e¦R`ôoðÓ'd¿$¿üiù×7ék®;᢮ æbšLòVÝÞÝzƒUѤ§‚fDNäe«[—xbq’ø3‚e':»„òŸYuÈËýV›Oêr¯q¨y>™úWNøÎMö >[]®qö¹möF—Q¹€€í åT¡6›‚ÑÖv=Ž®æ)IÊNÇüT€ 8 >aæÉ§‰<ã…—<´•Ý‚ú,q©nÛ´=ŽâÅÁ¦ý©¬×8j·,GÄvÒj9îçÐ|2ûLÞÀŒ ÉÏÍÁŒ~o«ÍÖ.åÆï«•®ñkÀ \eBJ—î+šDnì.˜Ø•©Éç‡ôó‚%eÛ–hºùùŽ“kØ«ªÎ:jWVÐÙ›¦n3c$±þ5bÖ¿Tò¤Ó«fP¼:ãZ*e¦Æ¹ä[^d*1ßÚU\Ô­.’®‡¯*Û57Çþpì]Ù1e €†“îøÔéÛ6ú๫jÝaÓú‰ D½[»ax±t ‚ecÜœM‘±ÜSšq&+’¥ yнjö‡î]ïPö[o]lEø&¦È2jŒA âñ¸[£Z^{ø•›ê› .]ߘ~18i]µQÓ~wlSŽIŒùÍMÀá@¹Zi(ÖÖ™«Ò\’×.Ÿ«Úe›cºsOÝ-\UƒõÍ„"ÄE³iË=¾d¸Á½g1š²É!~ÝìL¹ß×åÝÃçèæd™Jµ’é“3.MŸô¦ªk(înpé4…ÅÛþQîfE¶X,N·ç)-$c‹Ÿ?ÚÈ¥–ãä\,øEµ„fEá™ú<ýC|´8aS„²QÒS*£Ô&Ž7È>}ÒÒ"_¯®õsyܹ·Ì¶´|Õ¸õlx}4±NÄ¡— 2¹Ÿgª˜zÆYÂXŒIƨ©P™´Àr>«=°º^GAªrÑÙ¸a1ád0—çD^P.Ô@Ð0wgDI »²s68Ÿå†ÐK7¶‚MÁ6œï°ãQÕkq…·G\Ç÷ ®jÀd,®þ»-„”°†nÛ 7F¬7»Ñnç:Í èÚ'5Ä@*ïA»óhw½>Dá–yX“ÅS˜9/b+É9À)TáW2Öh%SÀA_U¯Z½×>Ùp ûÐïx„ÓXIBÍh»†YÞƒþGàˆxíTÀÑ’ó+à“lÁy |NσÏè5ìó‘GРnd4•Œ+À“%G@­³(wt -CÇfÂP2mPÞë ÎܹFÃ\çais#þÐb!1‹  !ÿkf~·R}(ÛNݲx¼ZºÇI>x6±6œ÷MOvæ¬mËÖÎüæf¬z8m;韸MB£ìPx­wÕ¾_¶ÕnP|ØU½Û?Ç£ 4‡­9œ°ÔÉ£ÄÙ ¥Ê"øyÑœ‚tæŸZçÑ1Ç¥r¥Ý¡£/Ÿ\"ÙYë—÷fâGà¸äœÜ轌'(ræ*TÓ°ŸnæÓí@¡¿éœXcžj’]f¼tó¡ŸLß¡hõŒ(Nt(š¦CGçT¢øÿâƒïEÆlŒWINµLD.M§H*šåL\B’ò…»¡9‡gºöæm晃™ðÆá°ƒÌ̼´6ÕkËY³šáp‘Àw ÉFwiVº*¬t¡ÛPaxÕÔ]Õ™ë)Ó«j|¶úع¿ñ …¶ÕýçæhÑ ^ô²ޝ£ÎÆæ{‚à·1`íTïý÷#¸4¿^Äÿ¢ñ* ×z1 mWs›.í“L·í°)îug™¥ÜèWwK]¿É3gÒª^W«K´ñvËýññ?€s@‡ endstream endobj 350 0 obj << /Length 1089 /Filter /FlateDecode >> stream xÚVmoÜ6 þž_qßf“*Éï2 KÖ.EÑÍýИbëba>ëfÙ—åß´d_œ:KQpz£È‡äCÊ|ÃàÇ7™ØdyDó(Û”û36îvw7ùôæŒ{9‚ä‘äoÛ³W¯“dÃ-XÁ7ÛÝcUÛjó%¸¬å¡W]H¢( ²_BÇIp݆"ŽøgþÖí;m+«Uö!Yž‰ .Â?·oÏ~ßÎö‘Ð$޾ì$ý-âô)b‘R–Ä11?;<„˜¡? ý9Âxõ:Ë[4J#04Þùx±ýÃI-£AxL3#<¢<áNø“ªt7ú‰Vœ œÇÁ® y`önaûÊ ^¨7~¬•;Ôm¥KÙ«Êíe4 Ì^O;õtÏ;çb1ÆI£äÜ”‹¬ˆcZdÉ‚ ª•·ÍXyæ+&•ÚÉ¡éÝ)ª–à#°Vcðä+KØ}­K<¨q+ JÓZÄÅG~['§[7ÚR¶­kUhM7Ÿ™'öUë™Ýâ$ Ýz¹&ƒ~²e§peí9Ú){pŒ.{íbÓ<€œú4eÓ„š S¾§]]_à…7ï?Ül¯/oVó Žcw+òìݺv…ð¯î§®$ûÁ…ö#›z’[–Òúk£{pÒšn/ß ¨t+1íSýs'…)I‚.yýOÆ^!fg:ꨱüÂ®× ÍD6Q·ö•ÞíÖb§¬L‚•qa·€7DÅ\žž¨EûÁh]-0ÁC“ÍÕ8¿xkOP–N‚²,Õ¡·ÎFc†hºŒ[ ´å©€Œýo‚ª[Û+Y¹{fçk)ŠÉ’j­Á(‹¾Áêrvëâ3E|¹§ñ̈ÜÐ@{õIþÕí¼wÖhXä4çs’~ Ižrè¯Ø+·€Jĉî;þ+·Zõ€3NEüœØÜõç!P»çàÂ¥ˆ÷Å2HxAÎÀ+xà#cöj¢.ƒÏƒ\¬4…a|Laš?í%ÿû(FE~z®Vñ$4Íùã&¾Ðnå~êTÖíì o®+àæßSQ ƒé倬)ËNŽ>ïLšSgýäæe_JÓÍÒ@ºwi|x€0þI‰Òx™ÝçaDðÎF3|bŸÁNPÍn=74>½/…‹Ÿâ心ÿä¿á endstream endobj 354 0 obj << /Length 1004 /Filter /FlateDecode >> stream xÚµWMoãF ½çWÈEVê3œ )Ðm³Þ^º{Ð:rbT– YÞmúëËÑÈŠl)®7Eìƒf(ç=ò‘q ü…È`d¬Ì¬4Ñrs%:kó…ÅÝoWÐû¥ì˜Ž<Z\}÷+Q"sÂA´XC-î£?ãŸóm[4I*¥ŒíM’*Eñ‡Ýºz¦ö±‹TÙ{ª¸^k• ÷›û5¿–IŠJh“H>-~¿úe1#¤Œ”¼ÅÁ{BÅ0“!:PA ¿óTl’’–ñ‡â¿¡?/Føy×áçg•HxÆÏ¨Oó%"&•„+Þ¯«%ÇC«â/ š¸hvëº  'o¯÷a³Ìû—ù2I!n×_ÒqÞö1rÿCóƯEìe¾¯–>ÁžN§ÇàPs~ŒeºÊY­æh(™“ǶWmò¿:a×¥Êß»m8…õC“oÂ>ßn›zÛ¬S9J¥0™0\'à "2¥òÉ{›xYo¶yS„MSÇL™> U0u´‹]p,Âë*ìÖ«áøSp¾¯ƒ¥ªÛ°xÌýCÐÑ]&Þå›ÃªmöËvß ]|W,ó²ìÄáƒ'Š¿óͶ,:~¢'Ö—¼SŠâRv…84 7‰~矺Ãê÷OÞÁÞ{7û*,‚þüùz³É«û¹2ËÜhsZÆ®ÁÒBÃaÚïÿÏr½k!¼òKœ+:Ì´ª~°þÜæëcŒ¯ê²¬½××^p\li2ߊã”4Ån_¶7³Š´™åޱ™bµuÎéÉç(ÇÁåúÚ3ÑÜŽßßÞ&¾ýcÀÞ"3¥Ð|»4†Y#h®PÏQnox) N B¢ð‘O£\ßði 1ª À¼e@u eÍ1­?ïêrï'†?[4MÝ„eIeÖB9%ŠÔ½ Ö»¢ÌyÚ¼x 2€è,ñ©Pë™Û/ªNª'‡¼kAD€œ+-uè$` ÊƒÜÿ¹ßæSô/»Ê\eЀœ`Q£@“‘V#i‰ì[bQ,4`±†SÏÝË"ð°¬%°g“û,êÓ ¬AÇ”xRv^ÔꜨ¿ˬ¨_ó QS†Êh!‘ËÓ\,j¾Ó!ñ|>õ:QÕ£IõtoQSÑœÓ ~C+éÉ¥æpi(AFÒ`4÷•röM[ÉL°Ø *Ôü[ÏÇ?ÀO´ó ù¬ß“(7$^2IžÆŠûEh#‰ßPÔî Š‰2’‹Ù92NrÿSÔþ?‹”ñ< endstream endobj 359 0 obj << /Length 2147 /Filter /FlateDecode >> stream xÚÅYmܶþî_q°?X Ÿñ4â¢/hŠöC?—"hj :-ïVˆvµ‘´6ο¾C©—]íS ˆ x)Šœy83œgF¦7ü¥7šÝhÉáú¦Ú¿*Âl÷xƒƒïÿöŠÆu9,Ìg+ÿ|÷ê›ï¤¼¡±…¥7wsQwÛ›Ÿ²¿ìÊãàºMÎ9ÏÌûM.„Ì~èëÃ#N ;‡ƒÿT4q¥ÈÚœ=l˜ÉNûm ¯ù&g¢P"“tóñî¯þz7“L)øWž"­¾<Šš…1p E )ð4ùÙdæ”*)®yó†žÊ"ûöÇז1 3JËLi˜ÔRYa¥4¢( %íBL’"â–þ°&DFY©$£š[Ê ‘„^^° ,oÞ³MNAõ„ê3Ia=ƒFÍôÒ:ºïÛæ48Ü뺮íp1q0¬‚(p¹¼ÅÙï]Sõ§«»4a‚q^p—« <_Ñþ¬ÿF“Ñ ÷±ÑòÊŸßúÀlBj<+`ð×c®ÎÛ¡Ä—Á7ô7Å»ÃG0ÚJ/áØ”ij¥ êÿŠ…_`#cÕV)•âRQð ½s ·DȳïÞ½ƒ+@Íwu=þº©û¾Æ‡mýð຺vGËÕìµWqžž< ×<§ŠnQã?§# “íÊ«ÚÇCýÅmñyØ•C94õÁ…ÕÖ§,T¸H" ’ˆö™'h ÇXÃÅ9)ŒIË>×ÃîLQÿë©ìâ¸k!š¬"ΫcÚÜ0ÝÃZ{y””ߢé™0D‹³ ¡.g"£* xFuš±qÀиб4ÃãLyØúø`Lé|òÿ8œ¹Ð;àãÖ5npqWðåš 5%’Ù¹Ùš™!Š«´Œx®)²»@0 =ÚÄuuU6¨½j÷Dz«ûöàöhÈA„*¹Úr•mÛCì- óO8®ÚÓ±Arƒ5®¬¼ vøäcW­‡ Uš(ýâ)9#ÔÚe¨x¡È¤_¡GÃÅ×âå\êÙÕ•?gT¶­ûcœûÔŸ©O‘ê'ÇHMf5DœÇ\ˆ^®T” tÖ—{‡SupÚà]\ói#eV6'Þ Þ…=íi8nhvâãýP‚¶¸«;è”IšWJcų³dÖåš ¹5„+–¬sð›bÍ’?ÄÓÆ5Kú‚‹XŽ…š?L]õ¸…LÏÆ¸®ÚƒGÞíûTAÕýû5Œ¹’IJ”ëL¼á‰Ê8JЂ*€Æµ3ºpg4dÐËUǘRÊ¢5z |Ü¢ )%0’ÀÆ2Ë'[a\*ÆLjn”†2BPlbVw&¥rÜj4³, H½c$5é4ç«à¤Tj¹fU°JÄ\$¨¯šÖë‘þ(ãÀYŠóiP <‹ÜŒ[™` êZ£)µ `{‹'äg«ÀC H†‚‚žUÁvÜÂa1Ø_À! ¥¹”,äåk~`Ÿ”S.¡ °ÖJm9àzö4/Õ·xš¯,`‚_¨¼žÃô|„ïVíðBQs¦ó÷­]þþ€™öÉ'Êö„)yÍ%æ  eí~ïYz~'p9ÖSÚÌV˜µàù_SÊ¢S"[Í^TB™J DX){šJ|uê±P‘æèC¶výj¢ã”B‘Å—t]7Í5^S©uÅŒÁF.ö²¾¢âðU„R͹óþ”jK8¤`ÊBJ$¼#0,$Ш.gækڟϬ4ßçjªŸ*ôùÇïX>z“Jž©s˜LY"©]À¼ÞF§Õ/€::7Õµ§?u®yÂñ¡ê*ÂIJGqjFÝð v?˜—hðˆÕÃ'_‚µ¿„t;¾ M­Ž'˜å d×9¬=0º?ûq¬wn§]ŸÞû¨^»TÔçŒUTbÿ?®ä])晾žW¢Ãð\ËW•(´<ÕÈØ À¬bY)øÒ ˜…F = èŸÕ®ÛHH,Ð(AÞÖ´j¨ûØX-cYX¹í)d©‚¦«_°©œ†Yt8LÎÓu¿÷eï|RÛâã¨{˜¸Åt—›S×ùbp¦ DQºô€Wã#èip9B‹?CD^ù$N³<}ªkµŒ¨Øc@É Œ‡%«ziÞ\ýzØø1¹t-±*H>â¥Dưñ(èßWÉQPñ¡Kühhý¯ÈzPèØªŸ?ûç”Ýuêsüjï+˜ ži`°íqéÎfÍDÚÐD¥ËŽqR.ÓåŽ7W©XÛÎì\ë¶¡ñ ­"QTþâá9|†¸ ,å!þvÐNwžú,ÛwqgìK`ô´ÇQç~=¹[Ø <ïZǼÃ'zÍ\õ§€Û¨ö’O ±%b:Ãèo¦“´=Ÿö¯$î3%H&?ôÑø…vf çx ”A3BÎü?D‚ž\ˆ ¦d–(!o \EM_` ´8ŸV¯±âRähZ¨¶îC¿@ʪrÇ!~ÅØnk”² locuÄ ¬jü„À¦†^ÿ$‰šª‰Õäï?VŽÁñ6é#¸ûûÎA#ìÞÄòh†¬+ɨÁ3 Ê5ÛøIhxy[V¡rRð„‚æWCtLo}Î \¶ðu%p£N°”˜Ì£©JÌxáÕª~Ê)±vÌWôýª±¨&ÔŒÙñmTzE`8q\Êž‘ÇæÖ|˜þ•¼b( =ŒzÑ¥ú\hà;•’«ŸòùÍÏì]HE~QÓà`ô`X€_(ÄdÜ©Q)‰FS´ñ4¥À}féøñ¿\zWµXeˆXƒÃdÿ¯ï·˜Òå->w.øÒiè'ŸýC‰åk7#°¤ð7ú¿\¼ Ž endstream endobj 364 0 obj << /Length 2873 /Filter /FlateDecode >> stream xÚZÝÛ¸Ï_±ÈK½H¬ŠßdЇöŠKÑ{¸Å-úTkk×êÙ’!É—Ûûë;ÃR’WÎVÔˆçã73tÄ] ÿÄ“wΫÂ+w·;½+#µ¾£Á_ÿôNð¼-LÜÎf~÷ðî·Ÿ¹eÊ îžæ¬öwÿÚüñPǺ¿ß*¥6þÓýVk³ùÛдÏD5 þ] }ä™zÓ=µ½—~s9íø¬î·R—VoŒ¼ÿÏÃï¾È‚i £Õ7ž"Í~ã(ÞAk8‘-J£é8ߟÎÇezÁ€°ÈÎ “ì§oå9 ÆBÚ¤)U»_ã#Ë€.Ÿ¾É§iA=ÎB¥Ó›¾y> ¤#ѿช¢¡èYÿ2öõ©>¾Ð²æt†ßtýXµ³õcGÏc=ÒDÞÈÌ,‡dØÇÁâŸè­âMöõÐôõ¾ÀcÜm…ð…v`¡ aàó½W°ì®œf€íwõÇ5ÝXS(-ÒÁ[t'ö—íù(>¾ÿžÇf}Á¡\צ+‚ô‰í©wxüC= H|^”íØ´‰nº"_ð…Ó!1¢½W6T²P^½å¢PRÏyÉ›¼ôÜPRYo†êT“ê'ÊÀª§é_ú.…c´{Éš4¾ð°ÔFq@ -XXÚjQ UÎm¼+ Ä»“fe–,K´1¥eE+—î€áÎKliŒàFÚ‚øA…üˆ±É³¼“Á+Ø4Xç´Êh¿ÊXç%0ͧ<,PA åñ‰±çYºZZ gñ^*B áì*ãkY”†câÞ‘K‘/mém0ÖHUêcækÓŠû­Ð¿[ÝÞeÆB*Q+QA{:x4€0å¥W‡-­wB@0æZ]Ê+C^©@A` z/­SÆH©¿¶©,óRPŒP&€œ!ìüUy—:4ÎØ ØN—eiMøŠ¼Ræ•6”ZÀZÐÒ–k㾺©ÊK]0&JŽèÈM´¾R畨!48šµ ÌÀ£¯7U`]ÒÒ>€ÑKøü¹9B0CêÚ¼ˆòž^úê~ —§¾;ñh9[¾_íëpF¼Føqʹš1yt—ãž¾î;F‹fEeüŒÒtòMÕ%V≲3»SÚÅ”Ól 7,Tsªž;*wä$Å 6í_°†øÈEF:áL§Õn¼TÇã l!H)ðÆZ:Àj³#p, õ±Þõž¾=r µÐww›®]Ïß¶>+Û¬–">gï™yK[6#Qúú|¬v5‹Õ˜ÝbÕÒðt39T“i²JW(-5ö‹AœiymT¾$EÀ¸¢Ç@¥c½‹‹²tÕƒâ1ú·àk›‡–žy¾ƒù€q›õ5DJ èt¸ š8zêú$O,[ǽN!`9J#£qÉpèV’ Ð!úl!—±òtiâr|íFúZùUO„¦¥IQظJl8;dâÍwwpFEßîDcK\׉íÎÜY„¤~Ú©á%”íDË¥é¯2ò½7ä÷ÆoâŽaäf5tD.w\ÌCéY*±Š$P @® ˜5$&:7è iô¼íƒ»®¼³¢RŒÂd–ªi3?në¾ÙUlj{½¡ž©½Æ4Qõ{"‚ãœbPàT|¯ƒ'‚Fò zÂÛe¬ço4ÿÕ¿øM[?#¬0Ȇ%·è 8k_›SúÀ 4ãà™„i†Ž…kX¬ÿ]†‘(nökõ©¬ y„ò#Æ`êl0ã×”_`ÁÅÈ # å‚~ii€Æ  š#)gPYzI$ÄþäŠßPƒñ÷èÆ~“(¼­[‰â$…$NÍ0pø•¨"j9 _ººÏ-ÔÛ„HÊ9_(:Ë©Q¼b6sV|å3ÌWî ËŽI¼év춈‡`WTΊýv 0c-œ½†>ùvRÿK{Œ N>Òsdü5fѰmÖZYÈLÓCjµ× A¥SSšSÁÈ{MYßvÝåÆ2i¤-ŽEaô¨9t ‡ãØ$Žœ `@VÁ{‡Ù hSBË)— ä£cÀ‘†±/ÙW‘˜}¡$úÐçñK\ aа#Kè&$#~±ò ú”(#û}bÑw—gô#&©n×Wnq£¶0…Ù0‚EÌwYã)ECˆ=A Œ†éÃåÌÆbM¤äÙû.†Že«{[2(2¤IWðMeLcëEᗀƬÖ>Õ6+%bŠ[<_, ð¨~ŽÙbº]Ì H?ßÇ„s©‡•b¦$.Cº fqáæ©?FtêuSøf >A!Ñwç¾Lˆ—q@šÕþ³­t\Í•òüëˆK¨e›D9¦¤Ž,R¯ä<:aJÚ¥ÜÐ% BHùZað}2f(ÐïßsSXrÅxˆÿŒ\²_ãÂ¥¼À·¢ÝœåÌŽqê;Û¹§|!6ó¸¢iÌwv‘¼‚œë÷uBÆÛo9UxŸ/öHóJ{Ô=' !ÛÔ ”vÚ§«9?Ý&ú©¢ÖrC^Èôtâ+öÝ™MÓÓÛ¦]Ý¥¢=š×ØB»«ª~8MMÐkSpŸ¯ê3Ìp;ÅLñk¸¨ HâSë`䘰:úf&¼0NPy(ð¼ûaê:C÷Â0…lg_±¥€Îýª;ïë RyÁ=&UâuôÏoW~‡x"ULðœŽ/sl‹(‘̶0¢¾Dй7Ëe‘…Œ/}Ë+cÈÜÚ+ ÉXS JŒ8ƒÖVë¤‰ÅØ3L¥8VŠ$rG5]nwgÐÒ­„c äRñƦav½1Gf>?¼^àµæV' Qc«åTZêW½+ÊÝÑsR–&ÐSôujbÜ¢#7:ò,a¼@Z(ANî—è; ä«ðª?@› Í)G`£²ëžÛæ×è"6 ñZ Ç3 %BVÚ6-ìô;P„X¿ù±k··Ùàuâ$ʱ~iôxóZ_èá´xóW+?ý\qáêÂ?’ìi[!¬[;z]^s. ì$GËív—>kàÀ1ÛNˆQã2útK3þ»zŠ`Íì ÂÄ'³u7°ÜÉ|øâ|ª~JwVøÊM†_t©ük9ÁŒ‡T{ÚÍðî`àˆâ§Î©ˆa^ÃfÆ#« äëh.yô¬ Ë—~|3»V%½, #5y)z'_í¦ à™{}¥z!,å; fœOˆ|»|ÂÂØ½ñ§)”Ê)÷…î¡ÕS¢™ªé§—•þÑ.nlD7¡ˆ±Ü/2¤šyž9¾äü‚ÈÐ’oàÝÂJMQGÆs_³lئňIù!*JÊœÁùç©ÝIª9Úó:ž Ý5ï2ýp äú—êU\­×#E•¢€Bi¦÷hqùImõ·E &h}¨Vë”$SÒ¹ŽzS”êU¶td5ò=&E t¢LQ3»éžEMüM·.o_Ý„±¨‰·³8)Òÿ!ø?klW` endstream endobj 369 0 obj << /Length 1380 /Filter /FlateDecode >> stream xÚ½XKsä4¾çWÌm=Uk¡Ö[[œ `#8Uxf”ĵ~LÙBøõ´,Ù±3ΫâÝJUF’?uý°º-ØPüƒfm81\oöåíW›ëMüüñ".E`:A~syñÕ÷Rn€K-l.¯¦¢.›?’oo²cçšmÊ9Ȯm*„L~móê:,u7. þ¤ ŠˆI}V«-3É©<äø˜oS&¨‰äÛ¿.ºøîr$&™$RðZ1 Ÿ1Å(b…@‹¡Rs>Ö=sÆe²ËöžÜ§0ëêøëíñƒ}]³&oë*̽E3@o°k½)¨YM5ƒTÍ‘m¯´ÈÛ"nÆkXV–„1J€›©,¶$‹¢¸`ï‘£œ­Ý’|0æï%EÒ#›ô¿A–.jS9`ß=â"ôa­Ú¤\3b˜Ø¤À H;‰pBGßU>y®b6NÂs óßÂoppÿèQÿ€°86SÊF'eöiËt‚aì§9î³™“tMVµWuSž¡$-]Y7w·¯ù ªw†ß‹~¿qˆ„aŽIwëÿÕaa’GèɈÅh'żXÌ1Œ·‡©Þ¨Ñn%fQŒ”ÌFezIZa³à_[ XK`”'×&¨Ö¨W¶Ø¬MЮ,Ñu-f°6Áµ_ÆW¶øuoÉì”K %¼—79+,÷'ˆ]ûù\ïçÚéÿÊìzÞ×kþ\OܾËÿñǼ+'['¦’\ã–TM •Ï©4DX@WÕ]_n´‰5IÛ¤WmŸgE\¹+=]O«.þÔºCíüûRÌ´þá,¯(Ù§¦ÁUH®Ã±©{µ{@rÀ§Æù&ÄÒÄ7T¡ÂYE˜U³4É}yg¾oÈ[?Rç”ýbŽRãs4< ²}wÊ ôp/ ‹»"‹ÂuÞç‚%¿ä•çÕ˨ªrÿfå±pa¹=f{O›£Ú.ÛE©øúôƒÊÝy%eMœ-H\„…zQšeš÷¨+ÄØö«‹ý(A”ÕCž·“ð÷¥·Bp¢™žtvz{Ó»fÇcás'¦f`S¬Ê‹§hKëµX Ø´}B”|ö(cB‹š¶o(C€_Tø4À¾ŽÍ¨Ö„éõZ¸Wh‘ëùY®ígõy</îåšjÌÔ<ð´y³§Í‹›ÓU|ðlǺ¦§Ÿh5^ëé·ˆZö4c_ÄÓüËxZ¬«æ¬ñcTªç¥áG,Q´/€Ø²œÂäxê ¯~Tèœ|}ô«±'hÃìþBêLN½ë2ߺø16,ûÎw<¹ˆ8uQ™ê¯üÚòå —ÓTšß¯\…Š9¹û™Ü¯„[œ¸}æð^J½{ÄåÄ‘p‘8Þ"}ì †I¤qv·˜W׋ŚPü¬Rû6G&œ%€‚B¶\kL£©Ü¦Ç (F)³BJj€ÒYÛ3VÙa‡¢RJ`(Rqk,³Ü‹(!f'=+ÃVa’š¥5·¸‘Ò<¹UŽ[fÖ w©—bŒÄs7Zó…–ZT!Àr)Ì’5*î@j 6¯Ëêõ#À8P©˜T z@Xó´ÑfÜÊðûGPe4€eHÛ{|`þ…2†q‰¡Ô³(ØŽ[8‚1¤Js‰†ˆENãy?ìš—­°VjˑדÖ0·Jä–Ê ‹±”R%m´fŽRÔ(+•d€±NÅpùý?Îq@ endstream endobj 373 0 obj << /Length 1233 /Filter /FlateDecode >> stream xÚíWÉŽã6½÷W}1ÜE9dA&HމƒY€hl¹-D– Sžžž¯O‘EÉËÐFgACì·bU½ÚXâ3>+Ŭ´’ZYΖÛ;w÷3œ|÷õOt'”_,î>~­õŒ3ê˜ã³Åú”Õb5û™|¹©vC½ŸRJb?™JiòƒoºGÜ65N~a\µ‰R‘~»Ý\XrØ®8–óB(fÑjþëâÛ»¯“bZhª•|!Š‘úC(æ gŒZd(Ó Ñj™REcŠëR;+¤Nk¥K@'#Ÿõ@TÁ%åš§«rºZ:m%×BJ.Jî´ân–B_ÜLÕtÑ:ëJ§¬ÖÆHm¸3Ò]Ê”Ž*-ðêÃÃüàL3òºiÁΜܷø=.VÍz]ï=.Öû~›fçÔâ>0¿ôt!,˜§ŽjëPÞ÷M· î£_•!¾^öÝ çÁÇsNà„“v…„DZB’äðzß,«·Þε!U{H ›.]h[œ´MW{<ƒ°AMÏ F¦Ü9°NÔ2 ‡H ª˜É*Ð:ÇŒSzÊKäxqŒ4#ÙGA=GÞð€“GÔ9YJ“~74}—“i-ÕLÌŠŸ²îPJPž8‹º¦óC]Sk{Å:šQíäÄü}Ž9×Têr¤ÙV¿/E£Û®Ç“´Þ×°]¥K€Ø$Úeåk ¡Å-YDÜpÚ†Ýa˜TŒãoYÓKH;=Ù¾ ua E±ÆÂƉkQàˆÎŽGW}Å•ƒ¹ù¾Š©T¨`./ìé§²Õ!ש€ùj›f}Ò% •T:uÃû¿"1 ö†*iñðóu¬³ÂÚä™0«ßíÚª«bÆç¹¾Á…ßô‡±a^µ¾ÇÙ¡[AõB¦ÄõÓ&ÄÅsX¸+.4Œù2øŸýôŠòFm›·)LÑŸBQQÚs†ªÃ8yÚ÷ñAb‚ìkhˆQ²Ç‚ûˆ:£ÇaÊÀ?.êXÔ€8† lVíSP¡Šfñ‰]:Ø‚B§c¡ å‚Ù£ TâàhÁ\eb§¤¯kLéS:AŒF“ÎÅ:vú ¾Ô ûªóë~¿Ó |œˆÑ=nŒéNžü(Î*ÊuQFÇàu“ô2=ˆqúáƒy‹‚ÿ[$ÿË9’\éNKÒôØþ‡ÝÿP]—ÆÒ×N~±ü…!#ˆ'A·”M’ȉ$cœÄF%š›VþG°!/=É»îz3ÑdB(Ñ”O_ľÉÿe6Íí endstream endobj 377 0 obj << /Length 700 /Filter /FlateDecode >> stream xÚµV;oÛ0Þý+´U*@–w<¾‚¢CÛ´@‡…»ôÖíÄ@¢‰³ô×—)Ö²hYbiM÷äwǃBø ƒ…±’[iŠ‹›™hwï/‹°øòqÇ<í ßÎg¯>(U€àN8(æë]Uóeñ½|wµ¸Û®î+&¥,íYňTùõaS_†­íÕ*,~ ëˆ¤òvvë mùx³Üø¿eÅ„¦R©êçüÓì|žS¨¸"91Š= Eš E!V5’Oùxo½e’ƒ‚ ÌúL %r‹–Ðô0â"DrÑ>95 |ž´QÑØ,H‚Ö¨2Ɔ4Àœ¢gÍÀó(‹ÞËä½J)ȦÈhÕæ|Ÿ¿Œæ$mYÔˈêQ# · ùâÏõ sÚ¼šˆ¹¸m©¼]lꇜF¦\«2Xw1E:züùvûk¹ZoêÕ2=£#°.ãx§¸AÓÇv¼#äëÔ' q­ó GÔè„!rþ=P.Ó”‹v94.ƒ㥀 t˜æ-Q¨%JÐÄv³€/3Ïùç÷c¼Š'ëÛ^Ýk€¾å=nï+(·ýø;ÇGÜ’ë¸U7 rñìo‡3ŒßÂÕ,"[ÚÂÎ:KaÈK<~ð›<‰Q;.Èôkˆí°?'cýÏ£ìîh«’> stream xÚÍXÝoä4ï_±º—ËÒKðwtâ¸Câ¡H°B~³:ûò£Ö Î’œå|±Ú«Z•‹_£o·Å~°Ý2–RFÙWËX)ýÒWÍІ­ÅÆ'ÆUMHµ”6K‘E‡]YÁ°\ÆB1£"m–¿­~8û° Ži¡­ä3W1¢ï/Å/…3–d “çIª%®æüü|s¦Yô±ªÁqнY—µåo°WV›ízìlºvG­¸xã–pJ^,2°ó4ÑR¡ÅëmµvlGU_{S¬Á“hXò¨¾™a-†SÔ8Ë"»l™8û<ú±Á1$¦µÐêP¶-šòxëv· Ò?Èé MRjhg@­w¸qÑÚPøâ¿0œ‚º$FÆœ²Eæ9ˆŒiFf¼œkv'ŸKU&KnŒÐæµ`egb´$‚%’ÿG¿Îî•a•†iýhÚp°©âF!ördÄË‘{ 8aY>5÷5µ_Ìü|¸ø/¬0Sæ‰ÒâÿPÀ [A!Ðcs_tCUÔ¾,€Ëñºk›«­’\)ÒC´ÁuR­­Kq·¾« \«jæîÑ øxùÞÝâ÷.éeƒ˜›È~öáh°GÏç¼ YJ„‘“¦Añ#|1z9Ü),qÇ•Œ~®š5™ ö -jZU~—¹®íW °[‘ñf”Öï#Ït7mG{LãRfŽÈ°¬£Ä|7y‡©iºCÝví÷èOSÒÃMùêkzC|+ÇìuªúqU0ÒY¨Ò×–†)ès9Ì™»ä:)xO3ш$ÏóœÐ«Âd‰ÉÅô¨Ã8Ìy"µz®=ÐÈôv¡Q\bh\£ >Rm;8¥½xÕžW K¹7Ë’·ótºa<À ao¬ÙÜÓ6 J]ÊO`uÑ“A_i·–Î9ΓŒÉI¿´ çH ´›}9e ¶Œ~ƉÞU3&TEäºâÁhÇ<°ÁÆ$T±A¨QÇPÍáÝâëHç_{›”<ú¥ôÝ=×^X¡|á‹—v¿°Bö|}î=ÿ¼P endstream endobj 385 0 obj << /Length 926 /Filter /FlateDecode >> stream xÚÍXKoÛ0 ¾÷Wä6g˜]Q[vÚÖØ¡‡!Å0lÃæÆJcÔ±?ÐvØõp›´î[-–‘,QùQ")&¿0Iè$‘,’,™ÌW;ÄŒ6ÇÛùòiœ\ˆ‚á†äûÙÎî¾ QJR˜Ì›P³|ò=ø°ÌÖj¦!c,o§!ç"8l‹êØuKe;?ðÒIò ^ØÑjJeЯò§Ù4¤œÄ<ÉôçìóÎÞìÂ0AE$8»'‹Aú:•x“ I$GDpË&œêÅiÐ`T‹@€=¸»óM¥Ð4Ž¢FY'Vj۴ЉY<+K}Á9ó˜g<î—®×­ž¹Æ~¹&žÍóê;é—kê™+߀žãèÿ¼»~ÀSß)–S¶ U(IÄ  ˆé³*SN!¢@ÄYvT*:†Éä STCy+ZWѺå,v¸jxªk[¦ÎG3qÔºe`ãÚ8ÁAÝýÊÕ¢¨T>ºmü9'FoC•4Ù†#." É›çĶð¨/¼[ÊËÌ‹=ãI¿tÁ÷võ ø”É“¯G>{Gc›J¼¹mÎaµ¨›®¯²N•çxèØÑWϦíôƒÀÑF¹ñáµÝ¬QvZUu¼tµmçuµè[5¬w«Ûój®ƒ{ÙÔUñ'늺²ë×áÄ\åýkî»Î¦‘p.ÇoðþcæXYèÙ Ž0Ád­Î0ÅfF«Ômf›#“l:ÚŽnL>tÊ"ÌëÕ:kŠvXwZtN‡:›—}[ Ú^ݶº£-T¥S›«²Xhoë F«FX©³u™™”còá‘ñŠÂ}R‘¥Ú.ù6•,¨{”Œã`žUº“Öj®éœØ!“m³nxÐ.Ò½¡Í•6¸*ìiÐ`†‰ËZ׳^²ýÒîY}bÞ\ôˆßXX÷ݺwµ¬fål­W+]]Ìèï±3ÏI¥1B£Í‹Å¸!äA®„WøuìäD\\Ô¾WÖ±æà1~ù®Õ5YÕ¢ŸWƒëÍùRz·´ÜÆñÒ“E;f.$X>ãkÕéÑ>–›–ÿÅSL¹¹Þ…è®T^qŠðn¿Ÿe×·~z»þôŠn¾b‰‡ðî6-ôYµ8%ðTÈ㕤±Ëx½¹Ë;«H‰÷­Ø×Í;¤@ˆc}åþ.¥¾\J}»ôE‚ƒû¢Ï½ÑŽuç?'q©þOï º¦§ endstream endobj 389 0 obj << /Length 1776 /Filter /FlateDecode >> stream xÚ½]Û6콿"ou¶Ú•dY’‹aÝÚ¡{¸‡!†­æ$Jb4±¶ÓîúëGвÏÎ)×ë]ºÜƒ)Š¢ø%’Òñƒ?>Ób¦Mš˜TÏV‡gÌa›íŒ€ß~yÆ=] „ñˆòõâÙË·Y6ã,ÉYÎg‹Í˜Õb=û+úiW\w¶™ÇišFæÕ<–2‹~oËjK¨ng xϸÜ{JÕÂVsa¢ãa]Ât:…dJF™™ÿ½øõٛŠX&²$“éµè©ïª¢ÆªpÆ ©„e’´Q¸ñË·JŽé2Ü$°v$ ¨&ª)·œ'©J{ª #™%†›/1й1‰iÂ3NÔúñ’)“Èl úI€7Ï“<7~šŠçhºG}Ó³fSÁÍ¥Lj.mÒü0)g—R?Ìé)úsþM Ÿì"Îî’}¥Ä“- ¾}¼¦mĸÊo"/æ)ùOyy'úÿ89ËXô]à÷æêgÏ'›z<• •ÈÔ£wPw„H£OXw,Â2Ú–‡‘/X¬êá¨ÖDóOHTÎ%ÀƒÖÖ±/lñg*tü•ðˆ?é+!£ØS.ŠåÞò,Bê&\rñ{='˪íl±¦A½¹GÖL5ïUPh¤pRnÓXÕw„•÷kô8äž¿À®{ËfQkWàϨ®æÈÄ„üÄád˜!8z1p—½íìþ†¶¯ìvoWMÖ•—¥nhöP7¶—Æ™¥©8ØFBƒ¦G"lÄ¿ØLFæÀë½<­±®ˆ_ƒ ]K—æ9Å|‹ý¡n»Þà{ Ý£Dnœeœ¨=R;'E"}ßè¹ûs ƒ’†Òs]ž`9–iƒ& áÚ®¨Vö„9ÆAN^ÀÝ ­Ά²WÁ`çÑá.†€ Tç(RoUÙLJ¼mÁp¶h 4ÁðKu>­wÕ¦¬Êî&„Ó;Å‹7(¡F¼‚±¬nĽl f°$ƒ6.Bߟá'Ô¸kW‡Y W¦¡÷ŠÏqÞJæ’^í_Ѽ7B&Ì@!Þ/»*®¢µã],—ýX˜ ³äŸÔ!£àB=8éªÆƒE9?WÇÃÒ•¦&´3ä• öé“v&Åû"˜û÷ÅÎFSÑ{¢ôáŠÀ$ÈÑg+]<§2‹°]w¢Ò·ø¨8\OJ-{.7çÐØCÑ|ÉQt'^8‰ÍÝœío_(€€¤'s)kŠÎ‡³…3ô j Ú·4í ˆîk &ÀpÔ¡èðÆW“×vã’+Rú%ÆoÑÙxé*fÜ{qú Õ)gw2îIæŽ5Z Ö“‘µ¦Œ£#Ê+šˆ.«µ%Ø]]® !æÀuÑÐ…0ë’ÑK{M5Ư®iÿ-°ìÒ¥qg¨²EßAE"ܱ%šöxMi«¦ xªšso¨‰I•Ù¤ÝA|ðûoj}ö… ¥S[бڗ­ïaFáÌä¾V4­ïrJ†Ô•þôïë­³ÌÚðS wÒNº –0ÆÝ“‹â4¤;Ppg÷ÌßÉ‚~¦UÊ`=>VaÁ„Å,8Éó«ÓoœvRÃe[ãÐS¥´ÈC`çzé©;Y"s>q繞ÎѤu ¢¨88Èxg"Î=^Àןg"mÑ¿{à:ô¡s 9âåÑó!—#4ÎøÐÐÚå¥o¥™æÕŸ¡Wá ‹N´ž¦Ú»·•3ÑÁ¸·¾Â ¹1A’p õlà—ðÞÑHøŸÿ0$Ic endstream endobj 394 0 obj << /Length 945 /Filter /FlateDecode >> stream xÚWKÛ6¾ï¯0öR*±|êQ=´hŠæX¸§6@™^ °å…¤dÑþú9¤W’)í&6 Qä7Ãy~¤ùŽÁ—ïr±Ë I ™ïêós³ýãüvÇ=.`:Aþ¼¿ûþƒÖ;ÎhÉJ¾Û§ªö‡Ý_ä—¦zMŸ¤RJRü¤JiòçÐv8563®N©È刳]" òù|haY&©P,SD—ɧýÇ»_÷WôÐT+ùF/úÖ•léŠÈ(Ó ]á4‰\f·U)—”kîWß3Æ(üÀEÁ‘3Ðãpà]š²UMá>sÐæ<^ÆÚÊ}¹D¹}c:ŒÚ?=sGrªÁ†àÎõ補1êéø.R|Í¥9®¹±ˆ™Á3Ne&‚æïPöÐO§Ê¦ïß!fŽ Œ‹¹?%)gš‘w7&À¸(çѲ1!§Œ¤2dÈN2>ç4– YÁÜ® /H­ØËd$;Œ‚P&!')»ÙŒr›ø\h;Kêµvð¹RLì,w›¶Ë‹¿È!Ä’ME_¯:>€âÚ–ÜB|YŽVƒ,©Ò5<<<ø~hOÆ¥„Üc Ýã›­8Óørì/g?ZÀÅ}¬ÌRQÐb^0€¶öìÙD›$œTcx‰P‹$M5àú¹k+ޘÌ‹9µp®ík} [<6‰ÈɈKÏV VzRHB]l¸¢¥R7 BM ’ÔU‡Óæ‹Ubü[Su‡“ƒd] ¥ž›¼.ÕÙ÷í8¢&ï,LLÝžƒ`wI}û—&U3Vc{)Q'mŸ—ÎàÀ¹éÇàÌûsR·Æ™:Z~W5®t—˜Vç¥S£þºµýPß îe)Uª |œ”œO³+к#2F3-h°.í±­£5,ËŒŠœÏº½¾` *p5¢Áòžîò[Vãp%¨(9þ*V‰êvâ7<"<¶y`NIî d§Ée½~J®dqŠŸ@K )3öÈAÚ—« "æ„Eðí³ áPbkére̯gk J(£U‹Ç+‘îÍðd›‘˜zl‘ÚNŽ!ß_)uë¾RÀÑR|Ý}å…·ì…e³9¨/Ëbqiyê[ìÅ(q¤…¢ºTo¼´lÜYæ=.ëÅiì‰ÐJyEÚ}"´]qßNhà›dðbÆvUGnA«…¾}Z­ÿ×î>7}Íçf Øÿ)ÿ‹þ¶ endstream endobj 398 0 obj << /Length 1160 /Filter /FlateDecode >> stream xÚµWK“£6¾Ï¯ æ¼DŠ^ 1•Ê!)o*9äxkIªÂb1¦Ê˜Mv}Zl`dg«b­V«ûëÖ§†Fþ4’,’ŠcÅeTv‘üúãõzÑDóûÍÝ7oÓ4¢ç$§Ñ¦ššÚl£ßãvÅqÐÝ qÎcõ°BB¤ñ»¾nhØi7øƒP±÷š"n+'mVLÅO‡m Ó|…˜ ™ˆ3²úsóóÝzsr,e)N¿1ŠQûy(Ù4JV‘¤ $ÜE“$É Q’’øm½ÇÁR|¿Õe}(ö÷îu[W•îz÷RuíÁÎú}Yëf¨«º¼7q,DLÁ¶ˆ¦8Ï”Ûöص‡ÔŠÁÄÇÛÀR±î=Œ­WÔƒ“”mS=õz‹ 8Âoš»MÐ>®hܵöúÐ;AÑÕ½öÃ}oµx\7NâüAYŒJÿìtãdUÛ-´úâൌÿz¿ub?/b‹•‰}0 J'…pŠ¡n½ÕÚûeÂ99c¢B§°8¦)ua}°À´Ãn›î±)LÿT…P]žåÁ±€Ôg·/i(› jˆªQ©h¶!SŒbFÙÙ{ÙäÏÂR¸X—!“+‘Ïëˆâ5â¶ I ƒ™£C1!kÄ F@‡]ÐY# *ªÑ™ÊÙ Ø!Þ ñÙ €×"„kÆ')Ó8èRB¬¹uæwÌ\ÅNýJHîÕòK®'tô‹^qì;¬_þd̳q¡Èü¾Yþ¬Ï)–L>‹M#BKN¯åW_JïDƒŽô’âËÈCð'1jcµñg^ŸM%óÌ6˽•<È—£Õ hîŽË¡þhŠÞZ)}ºu7ú+”•c¡N'»1÷Oå/$ä}vï ¹§9þvâÂé¥,Ãyž6¿Y¸ëÀEðÍ®ÝÖýq_w?)Q¤y:/£ïü.KO— ÎˆIƒ[ hN“µ/ÕÕŒ5&ë^¬¶9™œW.Šð‚A™‚ýµ9÷ö9éœwM®0 SÑyñ¬”_¤'§ûíÿHSÓÀ•Ÿ²+ÍÔù+îp •¨ÂRen·½re>md6¢qb펱Ûyš}ŒÊ¨Q O2Ç^Æ0M‹?õÞ°í)áé.wXh.`zl. Uä4>è¢q}̹Æxóoq8‚ÛŒ±CƒfÄ·^.À‰o›ú³¾Â@”Àõ-OtA™é5²uä–Tb&Ù‚ZÌíb÷ Úçvx2·æÅíæ{g]ÿýTì]‰O1WjNÅï íúPOôZVí[Ôº™}ˆ±Ñø1pšºÖ•)ð!£·¿•Î`cƆVqÔ{Ó-(IBç|‹.ýÂ'š沤‡e𠲃üZ~´<5ª†ˆqœIå8XNÌòk-GþŠþÓbƾ³¾­d:ß–2Ú ( Isà¿«  gnpH¨¿¯^ƒCøL`Âoºó¹¿ó}qٹˠьjËó3»êçßv½KÛ ã‡î›Ž· endstream endobj 402 0 obj << /Length 1891 /Filter /FlateDecode >> stream xÚ½XYoÜF ~ϯ0òRm©sé Šiëôš‡ÖyéTYI^µZi¡ÃNòëK)­¤Œc·hº¬Åáñ É‘¼ð'/bu':Ht|±?>–Ú]_Ðà§oIæóÑ_p~uõèó—ax!EŠT^\•KQWùůÞׇì4ÝÎ×Z{ÉóoLè½î«æšHá ÁoBšš9×–Dmv*ñÆc^Á²ÞùʈÈx‘Üý~õã˫Y±P…Ahô­˜¸?4%Zš"…0( DhÈÿ®¨ìÞ¨lâKÈPÒK2P—bçG‰ ½'ÀÁS‚yQ OuéËÖ–BH† Lh9Ã8>s*–¢pÜiÐá¼èÐÅ×A'—>¼iâÅžš%ù"B#ËSTQ†bÁÂòt Ê(’÷ôéÓ/°½¬jˆ$¸Ö{üó¾iù˜fyU–E×Ó¤ìÚ#6ìê1Šß¢ÉW „À—‚XÓŽ·‡j 8 ÆÚ«zzo³ýP¿Ã‰žl ò;dmGšÜҤΧWN`ZìÒÛôjÕÐb?.wÉè±Ïú"­µò^Ô}KÄSW ò¾£ù!ër’…ì(»§iÎ/€µ,®mÊXqúàXtr¾/ÙM+¤F5 "ì«ä}—7u2ñX¯ôëêf‡hhú†Ìpìà§*аÇ*l!D!6X"üúa«xb(†ÇFÝ Uâ V ηƉµnY“»ìP2H"³r•r»*ˆB¹rW:%+ôÙ‘G6><Î,›7ZX•mW<KEr~±‡Ó8ð¸ÜHÝ·Ç#â%kvÒˉö‡ÓŠ( ¢(šÔk0A–œ1ý’2¨ÿžæÚ§çp‚µd"×þþˆ3LpvûŒä„Œ×U]©«®ˆ á¹KiØ<ÿ0Ý—Wà’÷¢ëÁYò~äýi²wåIì:ÚÙ!»áÇ㕸soj‰ñH¸¼­—)¶°h#ˆm×¶á"àÃÖ ;÷K⿈­=wìÙc±Þõ˜ýe½ÓÓôÕ¹›Æ)´ǪÉV!+©‡•SW©WÇņVŠ®k;BB_ªµKEßg×Uiv›´o¤"Ž –dž(è*»BjÔÚ¾ª@¶ÑHa4tì–týÊ…ž«þ«×?Þá<}n ª&E›²=@ܧNÉï î@ »Õ¶Ã¤`Êǽ=Ù@½»¹R˜Í=çÔQHÒÕ½¥Úk¥S+ë0_‡J’{¬×Òò Ø}[Ǧ'Ñ·`¤m?•weO võE™õ@ 7»"UM¡ï¡Á0qƒ›ÕÑOå´Æeá;ÍǧÔâŽâUà 6¢Pì¼Ba¡K6íçO,"qjxx ]–cÆÆ´€9i3Î ø©WW öm:T”‘FGwjä€Ð6<àÒk·ˆWxã8Péýé9LæŽî`[In‹ ÈÞdQÔÍzy©R?žNuUä|2¡cO½vÊú a½Eop'÷¾èZgÃm$PÎwwº`µ+ æDãÆ¡Œôë¯n›sV `ëÌ-pÐ3>ã6Æ(èжÉñFWzMq“R6± ¡|ƒI`<ò¬ 4çÌÄóúik²N¬î½¸/[¾ÛÏeozHCÁÝÙ”òÏyjÎ ÙÚw¨Ê?÷Vñ‘À(©XárCÏ,Ï+*åzªïH†¨q«B¯‰hƒ5‰„UË2ðX³Xú ±5w8F'ÞË]bè|ɹC¶šÇöGW·l&¡²Wç•í=ÁL>WLø…žŠp™+}D–%^eoêB.ÆÊÝ€@¿'âÍiXµ}ÜÙ󇆲­kj1ùÛ¬oçÇeÒ ÑàúátÏ ”†$ðMë ÷w¨éŽ•Y‰P~”y¾­ Nf楛ѿyÜ­Àt£üèþÌ«gÞö u yÿ‡D!žy#Æÿ¿®)ï¯àW9@ÊŒ ÿoe? ²ôlU$Âp,§Û–ïKþðÄñ»|õÍôeüo/Ÿ® endstream endobj 406 0 obj << /Length 1514 /Filter /FlateDecode >> stream xÚWK“Û6 ¾çWxr’'±"ê­ö–NÓ¦‡v¦ãžÚ¸2m±•DHe»ýõP¶wÕÙŒ"AÏ-v üÄ®JwUÅuVíÚáMâ©óeG‹_x#˜ïŒ‡ÎÇ7>ÅN$q“4bw<ߊ:žv¿GßurrjÞ²,‹êoö‡X ŸÚI¶$1]×ЊÝ!mªåcD!Hö4Ãu°þ´´ Eç%:""7-.Þ~ÒèØiK'á ž—žÖ^=|§YY5ÁH(>éx!{}å‘îXÇ™yÈ ”=R嬷ô&ÐÒW޲ïaW呿»Ú­V¡ɽc®Ï@áãHuf¨¾°ôþtW9Ù?¶\«¡:×ãËâ tc¯ Òäù=†Ä˜0@íf擸hê5ó?nf¾€Z\3éÞ”ŠXT+Óaø Aè½jÙ肱“ϽšÏf$;Ÿ°ó€€ h}Û¼GýWŒ©È¢‹#v\½ÜIJÕA@Ë©³ì>cƒ™‘¯ÎA1Ö®ÌȤ“Yß²:óaVHóräýFå? òNš´ì¹HÍݾv#»[•Ñ¢5özq|r4À;¿g0qËñ|/Ì6Mªf[30D[iC¹ãö±ó —)³ã”ûJñúB- qö50×M4«ƒ}Û=ÔÍ`¼õ¿’úsÖ0 €Í~ç+Ù Z3LrV'ÚqÓf'EbÖz¼u8ØÉÞK•žÓ®²ƒ¬e"I~`‚[·Y0q•œƒõ ±‡id•£#ß–€pR½ò`ú GèjŒ«+GõÂ1¢~a_‚> ¨ut}±‹ìû'âÔ|ób|b¹ÝMf¹ttéŒ0Aâ4K˜-w‹,n×ËLÈ5VY,º¦Š>cŠPÕÅ]­Âî¤íÔ_IŸ^ξဠòz=òÑV(×Eq{È7èKÇ ·¸†*‰Ô|‚¿<_”œæ94Šv—Ü㈲¿„!dy ÅWXN"òün®1‰%[H{Å×½ãyN 35ã(ð®J_]úPœ‰ìÕ6œ&åúà˜¸xP¨¸%fM¢y>Ä´ýkêϬµ¥¨]P{©"D¢/ð’Þ¸½5´ø™•¡í—wÍœ&8~ç…/s#†•íIkÿ$âl@P¥Ù mé MÅUñIåÒ» `?P0:Ô/ÚlŒZ~¡"ÜÓ‚G3.Ö®‚›“iŸ™…Ú]é\ž†lwd¤ø"GÔÐö2›ebu†i‘‚s vØVâƒA‚±3VºYÜÿ·'phÀˆ¦ÉMe‰Š“*ü³‹(n"©ã´*_y`ä¸|HÁ8éƒü;Œ#QùªÏµ.B‘‹ò¾HÛ0Ð@Ã"» +—ËèjÀN\XEþú*‡Ã¢ðCTwP!¡ùÆ1õ_ßà 2»¾ ³ë ’6÷FФü±N®ÅRÚQì ߎlójåmî1}9üoñªžÒ~Pr f ÓF ÷Úp¿jxÚBoÆx=8÷œ¢ãášP¸9êd‰àÇdµÙ$Ô… 7p~3ØÐØe`==%ê0dКÿ"lÙoæÛ×F~ýìg‚™-¿FZt@Zµrcدm{ý £:ˆÜ=cð¯òÿ†#$ endstream endobj 411 0 obj << /Length 3459 /Filter /FlateDecode >> stream xÚµZYoÜÈ~÷¯ö‰ƒhhöÁk"¶WA+c±ÈæšáÌ0æV´¿>u5å쉨»««Ïªþê ÔE¿ê"ÖqbüÄě㋀¨Íþ‚+·ï^(á[ãzÂùêîÅË·ax¡? Ruq·›Nu·½ø›÷úº¼Y­1^úýjmmèý¼J¬—5UQí[èQÆj/2«¿ßýõÅ›»aµP‡~hÍïÜšã~²¿öûZ…ÖíOG~€-Ü_ºZ‡‘¥ãŽ`/ßFvz¬ÄOmx±†5lœòÈ_3ëü”ö# ÌõªßÙãÔkòÓj­c¯nº–)‡l¥ï+þÉ™ÒÕ\Þ§Û¼B–nÊ̓tgÛm“·íùåúFEqø!\^žBŸ¤ðGiºÅ9eznüz2‹;šö|:sñõÔÇâ× ²þª²¸Ï›ÛÛšEw¾_j?ŽÒÙ~Ÿ¶ã~º»™(lûi:ßœ¿Z'IàÝ”yÖæ— }z§žö§Ž¬o`Ze|*ð±?ná,Ê€¦¦±WT\’Lšxmâ Cïù¦ã®¬ÚrW囬^‹Ô›¶¨eºzwÆQ£º OÖR2­}l»üÈõGœ¡îyTÖȨ¦¯P‡é4Áüxý´yjM**Äó>4E'3fe+c9¬#SË!šac±ÛØ‚¬h›€‘SÝKB¯m‚V^Þr?*ï>~f–ÀrÃUxuMÖ<2IJ0nTåU2Ι·ÏZ†À\q™³¢äþ°Ñö¬J—%hݸŸ…ã”ðÚŽm@Ûe÷%Ž7öL<ÐIç6rn8 ]y—Ü}Í)+”¬¬À~jH'¾Û\éO¬«€¶LÙÕbƒêrËæh¶|ë/¡þZ°| (ÊýÜŸHΆ–¶Œ‹µÜ¤c%Ûlò“Ô æû#þ½—·/ìøl±l7…œÚn†É#jáy8Ô¨”XÍÿ%—PÉ(™®,„¡î»–î ÏȮɪ=rD·VAlb«m8C`ª­ ¥QX|;Ñüv´oÁ*ËõüiéC?Ö‰ã×BÄÖÖ»Þñ.Ú~ƒ‡9p+ãbáî¸ Ë] :ª¼­P+Mã¹QËlZ¡‚w\æ2è:™¥_Eáü’EƒáVl0`8 ßô`¼h7”Cÿ vÔÔû&;r›à3Å7R‹þ%Û±U°­¢G‡„-ƒ%`Å}áž´ò¦!­‡þ#¸Ù>_ÀJÚ¾êÞECØxŸ+~$@ˆìnÛþx’ÓÐ[Ϻ3‘BÞ&à«SÞŸ03³.–µ2¨˜cYèmó]Ö—27èî%›¶‡¢;,iÖ™¾~÷œf º§ü T¾ÖÊÆ6“,M›0ÂYœ5õMdoÑ©hOeÆz… ¹e²T0Ö„æH)Ú¥-¬ãÔ´ÃO…À²Û' ¯wÅïQ`X§{¢ZÆEW×\iYYr Q¡ãÖ!k¹rŸRP ßËör ªì˜—ÌõÝÓ»üÎ_ôFÖk';qE’E'#'@KC¬e« ˜ùöY³Ï§Þ6ñÝñBÒrŽ˜«mëyX´Vùv°ñ±„YžYhÒ}cE° /›Ê£ã kE'üìúwÁ Nz„ϬÊJî˜[?¤õà !$<®â„ ”Sþ[`lfà Ž9x‡Kb,*pÖ²íÎç\Ý’ X™êËj aû ‡Ï Јã•7\¾¯a„SPçOaQ}C>òh@í6Q½ñ§ºrÌ5ùF6u9d}+# <ÝÈÄÔÈÊN,œÇì‹„kØ*ŽrÍm[0èZq–¡”z[æn§†étƒ0æ˜í«¢ë·Â®ìEä§±I(”勹0~J-é_ Hª:aû3Û-« hq2—§ èPl³ww`ÿ=?^3A° ”k.êû¤H"ÅVÅlG±¢H+!Þ¯O—ìžçÿì‹©%ƒ~Öj•1aÛ£ÞbmÃþ(t±a¤qK”÷ë’^¾ûñ7ô« ½Âa¨©w¯¸Â¾àÝ^}¸&Ö¬E×¹LÀ@àL»RüØ©?új´œ¯åbágÜ×S%ôœp~¿dÀÛHæÈ37×UÛïv:†‚N³Åc«üAð³,ë ½Žÿ+‚Εrýô×ô¼L_ hð†àªô$Ú³±·É„¯s%MYYçiAeIa€,Zµeç—‡™–ßiÂ3ò³[ü[³F{F?ä-GÏyËk Úø£½W=wdÈk™0Ô!u¤‡G‡´cÆ>qAÞ’MA&rWÝ;ñ°¢ü\Õ—–Ç¡‡[Éf—U0MýÎŒj^Õý¯TG1¤•5A>Ô˜²€wÒM*mñ[Μô&µË¦@å˜I€.Ò3,ψhdZr2Ç1‘eAZ$¢KNKNå£Y>šBÏÄ|Ð9Ž"œ[ÐÍ&ßõ%7øl±ñšüH¦ð,Á.ñ˜ãy\‹ß%= ð;”RqßwGÐõóõÝŸ>ßqãêã/Kgùy¥$¯no¯>Þýò¾&ökÔ&läœv¨¸%`¢+÷BV’¬iDÙÃPð3ô>¼¹Ež×?Â2h¦¯^]¿¿¾û;#Î3ÓÛë»o~úiA£Þ┟n9¿bÿ÷†æ¹]ÁEß]¿þüþJºo>ßÞÀE|úéÍèUN@ä5î…D*K¼$]4E ŠsH@QCæUrÁyäV)ëPÿâÔaÐáè#*$ÎD@Ep«kÃ:ö͈ùìšdˆUˆµèB\‡¯]ã+å n_ÎD tUêµ5xoòæ&¦ê¡Êþ$ÔÆ\¶ð¨`M Âðò‚V8ápcÈC/ +};LÍqò°Æ‚B¶›¬$@µäHtšÌƒF ºIé5¨79„M›œ½„/Ø\Z¼â‹“*0B`¢ø¡ëÞ©ry¿åM-d·/ÊG¦ŽB ÀÇYÛˆ'…Uàþ)¯Ú8§ÔvÇ/ÅR¾ÌÊ}M¾5ó> —Æ  Öh¿¶ý†cF;të‚KVK‰G’`.zü_8„¦¤F5ý_ç¶®w|/³Ì¸D‘HŸD5|}Ó@ š„€*@ä}Âì¿Ãì¼Ãj¿rœÀK¤´Á€7²T>ܸ¼s¤\˜á@X™ÄFØ$²o)ÿ cH8‚tëTà*L:Àí2Ñ„äÆð"LséhƒÝÎY|ö¤>-æ…Í×q0U2&ÐÜ:‚ǺéȧFâ×€rVöƒŽ,ÌÏŽˆM<öë@Úçüpö†kû‚©ŒÈ†õÐÉìYq‘"ÚÐqÖÞ)öÈd:yÑe Dž0’6=‘­`íì27ÀS!Žˆq¶ìÑŠËÁM1F§ž•-pyœw°^$—áÞŸ]uAÀF±•8&‚¥I=õHᯠ`i+úa¼+NbÒ´¢Ÿ žq˜ùhP ¬O¯$Œ=ñ:°Z9¿‘Kü²H5Qaªån9j0ÌkTÉ6nSÀ ¯ïMWœ(Õ”lK`¨#J"mfç‘@2+ñ‹“Ž“)¢ag×ô~¼k¹IiœÌ)yÎM~$ˆeE;[fîbzæ’}ÉìKj˜ú:†tb½ ÁhÂ(¶#æ…6‡¥ÓÛÈõ0j[ìq“ð¡Ÿh=¿{qf X›¼åÒüÙ(ñ‡QBß¾irÎ53aÐLXë‘û'£äœSÆ|øtZ‘;³&˜è'ÝBû©¤y³(påGÑYÚU ›MÜf'BÂ~þ´ Q~a¤¯Â³ûNxyfÒw5ÎôzGûÚÓǬf§à~‚ÝÔM{¹ôEDùF f‰êEl}eµcd+«™•5~¨-¡´yìr‡ÈFJ‹¤!wHTÉ6”4ÄnIÆòÉ,–¤!2Ï“†Ø5`“† àíúdtþì«oükÅêô쬼$¬/äe¸ƒ^¦ èKgGÈÒ-PI11`yHØÂñŽdBqNü¾†á˜äLž¤hBí«$ù=’Ô~<*÷CQÊ ‰c…ÂT¶Pn¤s_ˆ,LdÎ.U>…²ol¬C€É×Ô‰;©ïÝ?äàÿˆ¦×y.¯ëMÛ-=U­bß&ÿù©¦gà4ûÐ;]k×€‚ã’FÊæ~X4pg~bþ[1ÁdÝ`†æ&Çȃ¦±bâÓ/°Hu_`ñ*ƒt¢égŠb@Qlô{Åø6ÐsEÁ…DH°¡ÍúîÛY`¾%/¥#?qdQ^ø ¬Ð\Ç–å&6|IhϰNS;¾ûÿŸ´Ô endstream endobj 414 0 obj << /Length 3246 /Filter /FlateDecode >> stream xÚ­ZYä¶~ß_1@¬†·eQ¢®}JÄÎñbL`8q«ÕìeÕRCÇÌŽ‘ŸºH«ñv ÛÀŠ,²‹d]üª8ê.€ÿÕ]Þ¥YägQzW^^DíÎwÜøû·¯”ÌÛÃÄýlæ×÷¯¾ú&ŽïTàçA®îîOsV÷Ç»y~(®ƒévû(мüÍn¯uìý°Ë´WtMÕœ{Q‘½Dïþ}ÿÝ«¿Ü»Õâ0öcݸ5;û3ûË#?M&~kÞáÛ. ó’ù<¥|äÀšæ4ãåXìÄCùy˜Ú‰coðDqè ÊûöÝ?˜òý{þÖÕ¡+ºgZ&^wû0óLwj»ò.L¬aV¶—ë8CÕ6ýk$%–è=î WÔ£tÛ3.¸Ûì€íx1]UâîAN±DÉÝ^E¾Šïú§@iSa :𪞿Hìú;CW4}] ÆN"¾¸yìõee˜Pá¯J¦6-ï˜{E#?… ©mêgG[.Ê‚Î炎Tæ«4¶’~¿¥ h&©²SŽÕ™$HkV+º¢ÄÝ5Ë% 3?ÓV0ÌàZt[.I5ÒðsÐŽáö¥3÷}Á³ŠN†JÐSu49úÄ=¶‰¯Äâ¾ÆSç¹WŽ]'rc¨2FUòH¡m×· kgʪg©B÷-.¦hVECæŒÎ7g.ã=Z\Šë(¯$µñªÊC=å™wØÁðóŠk{…Y¤Ô Ÿ‰²ØÏ³ÐŠÿ‡M)_ƒëÉ4æ ñÚnZ‡µ‘§¾Ž–Ú8šS1ÖV!ˆú§ ¢þU<ðDæ…­áM™&_Ùq¾¥ur£’p]Ÿ7œèù†÷*ô8Ã\ƒ ®tóp©qÿ¸u8ˆv*sá ·ƒì…†~ªÃC~üIÈm¤×(Ðükîp¼£Ã²AÆzyÔ§ª–êÐÏÒ•ÕWýµ.X¬{*öEBkk° x"qâØÅ@,:Ë8*‰}u©ê¢c"º ß5mßW‡ú™ÉóøŽ¿™â;ŽN‰½K˦Šóê¢9c¸¢E•GnhÞLëÅ¥%£/Š£+6î¶CͶy³©ˆÍì€QÎïQ pç{}{ž(ðbï¡è¹q0(ulÕUó…íâ\T _/ë-–!ißC°©®µßO»êªááb¸V©ÿ7¾Ô_o±~´ÞŠÁ®(lk?ôµ¿ebûOOüN ü(‰n3Ú™'9¨ å†™Cl ÛcK“Ï#…Ä gÔØ‘Kœ[ܘ*^,G&;“Ä™:±?ØÛ;h”ãUøµò‹”»€KøN/%;™)šÖ,nBïâ,-b3…]Xûü=íë0Vx)aó lbË…à„öI~T5Š{ðãõÚvÂ}‚—…ý]—öW8ûÛ¾´4^³¿åÒz‡&S#pp¸™éÚÒA,` I6î@ô;Ú LÌÇ[xÓÕ¦Ðg‚!|íÚsW\ììîR5xzî'^hªh˜#Žó§«¡8Ôf!m¹aº®µ&`m¢Íiæ˜N²_¡b4²hîrhv9v…t{ã\1@'ƒ«Ñ"¥¼'”f Õ`öØî¯E)óYfp-0â_?‡g&üÌ'þ!„J¶ÁP¤3_g¸ýYôð"àv§ýU– ˜X«9ÇÓç!üÿÉññŽ¢Hùuúy´ ýÛ2™™6.ÖÝ 6º0#ÐßÐRl÷fàAÊÄ25Ë•aôhjW¨H¼såîÅ}§w¦¨¹Å 0Ž4²Ü¥8‹ßbW2uüWâHÇ“5‘÷=»Îp£7œ¹‘°”«ˆ—²úÏØ>\R‡í§4O2MýÚæ(ó@×oå]ÙÂŒxg—°D|4bàò^Æ…]±­yn™îŽžZ\Ðù‘ý —¸fœC"Q 4¾$åˆ TÜa'N¸¤$•‘šEº0Š$[„»¶v9n¼B i:Ù8î¦!¦~8Íz³™™Ì—#Ä ŠÕ¯÷AÌÊ3¶ÍÀZ³¶_%Ž1+ ˜¬;G›éוEß•#”Z#Ó&$ÀÉIÔŒ?­5Ç~qãÕtãÛù°›îÄᡶĵ¬¼ÿÀ“÷±Ÿ¬uUHÀ4<‡­Æiì}©ýHÏ©¡ Ïß™'I?¶Ý$lÉ)XÞ츱ÊAøã@°*R¬Us³8œQ£O6†; a.Å ¥*wÞÆôQˆ.0dĉò, nÈn ÄŽ®$,*z<"qr… ÎW –ÅöÊå6C±8𼩍Ée W¤:Õ. _hjKÒ DïØåÕ“}g«ä4æJG¤Ö- ©÷Tür‹Ó±È&6ý8¼ÏÊP:›É¥.P$*ÑCŠzÀ!€=‘F¬8ÙEòÖÓ‹ Õ•¹·n«˜ìÏï¹ÕnzvîÃó©—t§³¥gî±Å7 æ™!BÓˆ ‹ØV?D*£”¿‚ˆrïCÃÕ&S†¯üðÉýî©&ÀÌg&HÓðdSÀs¾Æ2°©uñhQúÒWuñëB*R¥ÊNñFZ†³ì#€Û¹lÏMõ g‹Ûa)Õ4ñÓHÝlò)ä“j„‘ûÂs‘`£2—kÿ` ôý#}Öâ|áR…œŠøRåºï¢Êç*¬ÚUX7/tYa~QÉ)Þ0ÒÝË÷m]›³+†óᆄ c-íBA Ë;žœ²f€ÙCÈÛhæo½° „Ø–‹•lL|ì÷fÕBe«…Êp•f1QvÊÈaº—Ê£XÅÏ/d?Áï+W¶²?ÝBÃ(\›¬l†³£ÎV… ùšò7-å ñ ’Áê·Tmï9‰H"ûg#¿c!½/»êàÞ·ÆJL¢õãyäň/±AV_Ùð­dó¾«ÚÎÎýø YàXIÅK^£)µJ˜¼ñn½:"b´_'é6´uhD°ÓߊÔj‹²4W-—P¯7?†›Êd.…&hDt†PÉà N3®Nàà,€`’¡5So`"Ö6ŠÍ×ÓõS€&\þ5¾ý»®ÿ¤ð­v endstream endobj 420 0 obj << /Length 3191 /Filter /FlateDecode >> stream xÚÉŽÛÈõî¯hø hÑÜçÔÞx<ÆX™Á ÎM–$¦)Ra‘nw¾>o«")уfÕ«WËÛÙ¿ñàŸ“7iºY˜Þ”§Aûà ~ýé…/x[@ÜÎ0ßì^¼úÇ7¾çæ^îßìöó£vÕÍ¿œ»óy³ 2GµUý}³ Ãй{Íߟ>ý‘óa“EN¯ÏÞu°!uÊñ¤Ú †b¨»–·|¬KÕj@ôóÄó$Þü{÷ïwö…q»qþEr öM)ДºG†¦ q=œYšBßÒ”ÆÎÝf'†$˜Øä†$˜!I€Ï$ÁÀ’k†$ ä’—~»™,B7I}¾ü·M:ª×–'¾Þò(d~ê6ÀðoøGðïK g¬Àó2¼ífë©ëáù~즙œÿ¶;ãžç¾>q0n¹°Ásà g¼’_œDóoC×vÎоz~¼J[œO@ „oòníóü[&†ÁMogï_Ñ›/Ý~¬E•y‡½â cÝØVÄu9å¾-ÝKåñ=ÏÍn’4t£Ø'ÕqcXq½þøéÐ2W&Þ½mgóHd/® ÚÃp~ýêÕ^ïÝ®?¼ºzT–¸©·|Ö5Ú`_?#^yF”º~̯xÏúÒ?ã§k…§µfn‰ ÷§zTŰ¡ão‰ “:Ï<+ZY®j=ôõÃ8ˆ¾!’ê@'»±VšÔ˃—‡ða H’¯8ò"§1†OGwôñ ¢"S¸Œ±K„‹öP·^ªùÊym'€¢iÈ\HeTå²e›eñÒ0Ÿ[=LÈö ÓÇšÔ,o߯~ílÔ~xy‹ë#Ñìèí¤ŠVÎŽÅÀ# T?KŸLá†zy‰S]&akB äbÔ(4PJØ{Òª™t`"ž[ š~úÌš]œÌã"‘s?0ZÙ‘ÝœEľc\‘¶73"¥_ùIµªG'‡“Ϩ‘%…ó·+f2gç,ô³('X IJׇÖè•hO$$#Hw°ã 80kd«Šò;¥x°Pn°¢CUœ® Œ#|R*˜ ‡q¹ë+r'[\H38ãðk0…9Ò®ìíƒåYLΔi¡9ÉœnYØKL,¸Ô?$U RßiÁ1kж¤Þu"+|:BâYbŸûîÐ'kp½MÅ  Er ;i„Å©P,»)y®+rˆÚu­-¬±áMe~fLÏÄ \òŠ¡B•Ҩ젻oF»¯–³&‰˜©87XmjÈÆH $ŠMwY5“½3Áþ}M¬ À¢¢åµ[œ€,+‰>øŸ÷ÌPL@FÊ(`2wÌzØCÑWÒš—ÉÑÀWX19ÿØÌS©e/Xò}:* ‡'ô™07¦Z£¨¤(!õÀϹ¯Yu°¢²ºGA6ú;FPŽ¢ðÛ > GV(æÜ²>s„†Ü†9„+3KÓcg÷,ÒB„Ô«IpÝBŽ1–SñkœŠµÅ½XH[*É`WS_ػϟ?Þ¿½{sÿñ~÷‡”äŸÞIñýþÃý§ûÝý/Ÿ¾\ç·Ë8–ä3…Iq>7˜ÏÓ„ô1ɶ¯gžLÖÆs"M‚šä õIÅáÙVß`r‚Da<Fjì-Á(!Þ¡nåÀbàk,>7EIºíeS÷$à ½Üzý©¦õc×°[…±æ¬†s /g58Û’—ÍlÉËfU‘\ e©9InE-íÉÀì…Öˆçžå¹»FÏ—ÑF°Ì'ò3ÏOcðŒÎ5Ï…¼E×7Õö Ò#äl8ì )¯.r*Ï[‰gpxc)áŽíä2ŽïˆT½­¹sÎßq™ƒCæ³ðV"±(‡ì”›™´ˆõ˜ÓÖ’Žá\CXÀû Ô ’>—#ÄÎìÀ<êÝe,Ád*ˆ­”¤`¯öÌÉÅŸbU‘.E†§ÈpœMnvµ¨E1g™¥­${g-$K¹>¸jÚd¢™ *&Í.yLªÁ¹6~D4(›È ¤l™£UÕ”ä³oG¨¬"—¸˜_ÊÿàŠà•¥:¯¦ƒü¶ØŸeFqàÔ{Ê™ ´Å×#!$¨¥ãÏ`ó¢ÞŠ}sU0S“ÞŬùfÑèÕÇCï256´tÔ`;Ûäµ^®yL銧ÕTîdGÄÔŸç•Å! ú7 9ÔÍ{É*}a —°17—8­KºV%q2q±fN‘<bÈÉÑúÉ11—‹U—É¡«—°…ÒÔL ›ÌjXéñTŒ0ïÝJkBÐLÙ,õVzUoEÔYzeððcºaƒÇ¹D÷Î`rDYy~S´‡±8¨¥°&Y… ÉÊ”ÌÏ ú¢( ¿äe!lQ hSÁ†[É™+Jé#ˆx ÈO÷½ÈekÒ„j%ÑžvìùËÒ‚Á»µF̵ R8̰òã4>|/›QKýG½X–g¦è¼^5ܘ¿€ôaPŸyEާ:_óœÝ[bštÄêÆ¿FŠ2öŒ¡{׿ üMK—kª âk›ÓËØ¤—ùêÅ{ÏNô² å’jÀóy•ýfì]&1…Ô#|z"±<Â„ÅÆµßØó»òÔòÊD³ÈeåѬdŸuï… Î B¯ «HÑîH •&WŸ³¯ÊøU ŸZ±c.?ýÀ#iB,{Š˜"ó2s­P`íªSÒC"ʼ¢ væfÄSÑï MÆiÁ 5Uß!'£Î`0÷k„o/qYH)ÜqÙè®>‚Æ®¼‘eC)㔥3Ótª>Rn>â¤\C××%¥«)vÛÖP€ëbA©‰Ê0 ³Á„eQÝà™ýåžIùÒÌ(ß­{A¾à¶x0¨¨š[Ó” î^Šý/ƒ¥Å…JJH™•Òùj ‘’5 Óµ©<"©âlÜ ):~Ðä¢àÂÙÖ}˺ ¬(úº˜‚LntASÔ“²á¥êVD2i ªHš4Ûͳ'tT–ö7ÔC£dUŽ6d:jiîaʳ¢)ó¦aBÖº<=ôÅ5Ž%/^’KæxPOÑYŠ˜”›®œÊ¥¤ÐfÛÝÆmãè3¿¿fŒCP4Uèõ2ÙTkméKÜïZHƒÁZÀlã¢5±{Ùý¦äž·³°‚-ú¨­§SÉþ`eæ=¸³¢Zi…È5ó–ȵ¡\ü²3ï“$3“I1xN©0|Wå+lá_yüdÕÅú3÷Òo 6‚ðêÿTßýɼdthµÔ»·?‘ýègóÅoeJº™¶5u£q®M¿ÜÙ6vHÏJ¯-—&ÛGÐÚ—˜_\å§WìÄ·êÇn"H|roMÈK©ÞAðŽòâïú‡ lÇÇÖE ¢†dcàá¹ÐR;Í3Ô"üb(“Ž¸ß˜`¥¢Ù)‹ô{±MÐÞÎã±}\H“›V3Í7Õât@:;ª8{€üCĘê¦fçß@èÙÕÔ ~ÖÙÀe[¶¦‹¸n~豞€ bû|E-‡®vlzŒqëš;3âÁg«)o—‘RáAb_§7–ÉLÅá*n¨ᚘ› s³ùý™UYV§™iOËQæ…ræñŸüÔTiûÿþѤ> stream xÚÍZMo7½ï¯àÑ9t—ä ‡d`H¨(ÐA>€´®Š-'Bm­!¯‹ôß÷ÍÚndQI$í¦ÎÁZ.9$ç½yüZÚçd¬ñ9ʆ¬3Î"iÉxñD žø Ïd80žÁp&CΚõéÄP‘Í&:”»`ë3š¬õ‘—ÚuíGdxtäbBN2ÎÃŒ<G¤EÞ8(òbœX[y!$Ô=¯ ­åQ+&tLÖ¸¤-Ìhƒ|DB`L ¤EÞxÐZ÷>jà¡çŠ(Ÿ‚pƀȨðB‘ÈÖ£²d@ÔE Û„À|öÁôÄ [0 ¢¤"V¤J#«Ï€J}“^ë$u‚¾€J}†¤V35 ÚœÀyR¢ÓÚÈMœ+‚å¯Äv ™Äöàc¯!YŒjH F¬ÁAw¬àH=Ah MpTµ"sE6 ÌSdDVyDœEÅ ÐâƒcÍf—`œÀœWHx àØ ”²úkK¬(¡zÐx \A¬£I EÕ“4'šÀ @Ȫ!j!P/V™ÈшSÇr6â=h΂„¢„jEÀÀ&L*±b‚€% AZ ¨ÁµBÅ–¡YÄYã/ UÎ!Ô¡ŸÑŠJU gäz¨ºÖfTàÀÇŽLT™3þ"k`82"Äp;í¹Q Ä/‚Üêð°jž›#7¬yiš·¿ÿa`›M.®ÏÏ«'Oz³I»èÌá¡i&¨ìní'ª“Ô§aÖ¼X¶'¯f92Í‹çÓ¼ž}ìÌ-¼þçr†‚éûYÕüˆÖf‹îJuªÕ«æå쪽^žÌ®ú1Þgý:;OŸµÍ‘f@еGè;8wŒÞ¦K4éso~Û àè¤1N3Huƹ-Èx¹+q š,ƒKØa(löàœ+Áå]ÀœXçìÈàP‚‰ÙßaD»°)Ú‚e £C :¥#ìIÇ'8÷©YÁ¼/NoKœi(Î4O‹-õûui­ç¾¼j^]¿ëú÷_æ‹¿ªæY»<-oº°ÇêÇ `ÃR[,Ñ"¡¶Xß°0׺Îa‹Tça÷´gð•i~j_·Ô<ŸM¯Ï»?-Ûß®/fËù‰&'íòbÚ=R~V¢äù«QÚ`¨Öµzм|o á\†/”ð_#gÅÌYFœVv_glþ—•˜JéÒPéÒ`é:εłîAEÒnvµÓ ´§:†ÊÌÏ;èuñ~]¦Äßp_°7í¥äh7ɱ]—m'¹-Ì6óýöWÖÕu_f˜ fØ d†ý{Ñàr3Èa(PÙJ,#HàÞ$ü ‡J(7œ†ò”GŸ† "p4ø@m%ˆ-Ìv˜ö& œÃ^“âÊZnf#ýfÑ?Å ^›b®uÅA¼Î8yô‹RHp†7.N'íÅÅtqºº4íÞ1³­—}mõ8ïC0[:‹mž¥ý¾¹šéþ­=ÓßîÃÍËe7ošúáí0‡T)©Îê¶–‚Ù+A7Áv¥—dcμI9(e·A)²>(…F…6Êä#娓8ç!~åŽ"ºÐ¢ÿ> •{ˆ†B{¸Ï‚©ü„ó@8É~‘Jå9+ÑPhü}@+§Ž´ÛÔ‘]mÜ©cŒ• —+Aöafz°±–S G†Â‰‡ËÞíF¡„Ã[Ü(¬›Q¶5ûl˜SÿÜÿŒ¹7RÁC‰×òVw¼U¸…óéLÀ· o>lÞê’ µ~Ò—œj½n ¾ &Z}=^Û/›OÛß7/¾ù9¸˜ÎÏ»öñüïËåüb~0íÏßÍ–íÁiÛ=š¯\å-n>ö4ËT‹a°¥7œ»ñ>w€C‡/_©ìÿbÖÕÎâÏn}ÝdGcºGÌæ ¦} (ïWx·û•;VÀ­¯» gm­W®Öÿ1pIê¨÷Ô©ßj|èºËÇMsvuV·Ë÷M!ø/’ù;"< endstream endobj 424 0 obj << /Length 3557 /Filter /FlateDecode >> stream xÚZYsÜF~÷¯Pé%TÕÛüù¶SŽãM”M¼›} Hj¦Kr–G$ÿûð¡IΈŠ]z˜>ÐÐÀ‡ƒò/<úó/Òà"݆î6L/ŠÃ3OF»Ý¿¼}æ+݆7 Ê×ϾǾçf^æ_\ß.·º./þã{}=Ý0b7ŽÂodÇR…§,tb,q½8R®è:éÖùÓ£ë«mètyÓóŽ/¼u†KÌí‘ïÿ½ö¿Ã¾BCøÜZ>iÃbΩh?tsÍ ¦Ù›¦ÚtU^æ7µl“á”-B2ü e‰òØU½îZ•ØÁ4 ÏYdÄþÆ]?öÁÏmÛrº@ä§Îý¾e s³?ÊST…ùÓó£B‚gLßœÏøë*ŽÜÔ¸Tä'ÎÐbZ˜åÆ®jª.¯Ñ9Ž7µ)è²QÈ$ö`»g?šÁn•:·W¾ÓvhwÕ_¦7Íî„p 'Ä_ùX¬ÁÖsú¡ËÍn/#Äí=7ò®¬¿`Õ½ö ”›šÃCõ ë«Ò m×c˜ïÃz±gïÇ}sÈw•ÒíšOÒ,1Í*ÀSGóPÕ=-ö×Þbº@úÎ17“rp·kw]~`Ý=9–Gå¶Svò&÷$&!£}{¨Ðº7eÅ\ó+¯w¶èØàœ’e°’…“7%&ñ€¼Žp…ŸåsFÎ-Þ2v m×Ç=(L¤WBRÉ¡êzP`Ý´AääãÐKJV² Ö“ŠÎ[æø›©˜‹ ò‹Ì‡õ+z5ß> BY“\Çøù•«óä|u—¶| ¢˜LUz‡¼Ô]Å4)ú-)swoz¸fI=Šírq96â•'P“b>µ»ô†A²…ÞÒ`~ChQ(…hi,)3gŸ÷˜½šÓ%„(ïHì;Qð¢àQ²%º¢ÚØ Ûv˜+M_´cG†‚ñ~¤Ãÿ7Zc]¹ý]ž€PèÅt•&µEW¸cô·i4V@šŸ&Œçº—˜.š ŸÚ)Zî„—`Ê[üŽbîºÏŠBå½5ù:bžÞµgó01FIöuù¡gÛÇ»ðÖ3Ñ«HôŠFzEtÖC\žæqyø5‘“šæu-<ÐR^ñó1§÷¹t'fb7ÝêÛ¼~ÈǺêá[àã²¥Ñç±Æ%S° j¬Ücrh¦ê­Ó*ê±TOw¬ éß¿Iü¥&Cp=? »AÂ}aHcÈHA|ễÌõ½‰–q¿õd«ñÌç&Œ}×÷£SU”KW¦¹m‚3Šqœ*@~ȯe'?ˆÜl›\l7Œ¶*6™¡€‚Y ÿ¡›>ÞÑ2’¹Y$hen¸µlüúö§k̆´yZ*èãÙ>ÄŸ¯$¬ïC±OOB{õ „'ô·â³[Io“É­¬„nF—nùêúÕê¹Ká„%Ò—‰‚­›ùáéËÀ‘mödH%yvz˜ ÛUÑ6pÑ\šI ëìÚ¥âåxwý„T=× ÒùVt%Χ+ñõïEgŽZx»ÞvZýéÕ›UÆ™ÈÒ”UovM¥ ‚H%˜â5hü &7V°ÍÜ KNc%BP¿di¿žÚ/ý.›2[X4«>æ4ˆ#7öfV?¾}â½ôä‰Ï¶aÝ‹'e¦_®Ë,rƒd"d…X¹‘ÏÚþã§Õù™›ú‘J (xÊ?€"Jiû3uœ+N9j;rà‘wl d³übs«§¤†:Ytسatœ†8­´Ý6bv²JÀã#Õ·]i§Ù$(Wýf5l£hwí5ͼä€'ý¯O%_žpzÒ)úºßSÔGš¹G—cÿµ¡¥Qô5€‰ …–:ó½=ƒ$hå£p§±˱î5bë4ö‚‹¥Mtj òl„=A¡b˜OfÉ.ë42(aØH·!²>f“bkJüv‡7Ô“FGzãÛØ|M¾aHüM`–|̧Áì[°,œ•k9•ò;).µ5Q¡Ö=³¥–‘¿=k§\BfGòY šÆA})m1vSF¦‘Qˤ·¢VÛky‰ Fäd†Z»"‚ÃKtr©¼±±K1H¬¾Æâ%é‡,r‘“±Ú¹êÔ¬Òœ™g‡ù¼# —Zfè«úV8Öcá~œ ‚#Ϻn)œî°šžå㑪25šª*m+¹ íÛºä3}Ï©«¹™¤¦ƒ¸3¬Qò*!,õ†½ÑÝ?pšFÊ*Åè(æ7]¥ÓöœÜV‹ò’ÉNºÎ …šÌ’»a¿¹‚¶Rf—YÜ»ëÑ5 ~'“-K»e‹_±inìÕŠÉ<2ñÜÑ+qï$º·}®vDÞRxv¡GÜ= î#›ÓÎ_Ë$z¦¼C ¥jÈbÑ"k¡pgQI–¢Í‘ëÑ äzË-Ôèè}ï¾ãŒoKúÈ1®ÜX;ÈX‘+2^Ñ­“Õê·v¦i¦Éå+ -M€c6MŒìX( CÍz–&º´P™Š„¡=%Ï—ªZG#MžÓ.Öܳë[U¯VÕM%f†Ef90üÚ|²×¡37#‹H„…SÒâéÝ—:»Vé[×’AL½ K”÷Ei ¬© -yÐËàµeAr¸ˆ’¨?>ÿûóV¿PWäŸ&?€ŒËn7ccŒKa$µ¼õj%ÏÛbaºÌ€š•á ÆSRãã„HJÄ ‹šR–ŠÈUÒ…Ñ#æÀ¨Å™”ÿõ'$) šæ,r_ ¼óä2^íß4Zä)­ ÙÕÓ5u>Êã¥LC„®uÞìF£M .ø®b@åIìà ͩI6ÊX„á¹Î©Nj©U§Ç¥?Zö hJ/€åQ\ÈÜÒ£Øl= kOÁ~³y.dw DEz³«ìò0—ŒòQ"´¯ÈîQƒé—ï›’<ò¼ s) +BåáÙNÛ}¹tQ–ŒÒÕ”v¾É'®[wiyô ã e+ÏØýÊ]Ù2'W˜!Aå9+IîÜ3áÞÆN:øEňΔKÝ~Ál™k¶œ…Ò©€µŒþv՚˔gz¬X˜ñFÌИEEškùQÒ–{ÊŠUˆLÙHxót`%ëvp)Ä:¸dQ…áÎïì]¥ìrK–9¯L_Ô¹9 dK¤ Š¹Ô’Zl’)œðT;˜BÛ‹hž»d%0A^·_/h‚ÙÈ_|âû8ŠL‰¹ph?C„¿-‘Á&Û€Åa÷x‚?^|Â'îŒO½)ÉàËÓsÕ*W2•8kË0>Q»«ni'qÑH¯1lc©Ì²,¡1j~®‰ ‘æJØU»¼+{ –z{(Ž—Ùò¬e”„ögºÁÒUf¨E¯h)—PÌôE5_¸It OjþÎ&®Ç¤³Ä,$ã!Ñ~Q+£«'íßÄž7ëk¸´Yî  B{Ù aHCxQëª*ïÇ®Zûà† yN{CJ>ƒö$ŽÈ Œtm<}ìI™ lÉé÷vìT&¼–¯¢zÊHKž±7ï3EòÔžcêò;—,N˜mÑ]{’wˆ©t¡¯xÆßPO—Òý8])/sñ…ûú59å Ú‚®—@hºz€ˆù[F_ÊJæGÁéý-O^‰œŸ:ïv«PY5í¸ÛÛÔ ùMÔÙu§ Ü$ÎPØM!Nêde¯µ™¼–èMc™9n?É£SµõË)ýÎá…«Ϭµ©·ÐÚÔç³[ ו JêÍfn=glJa+µjB^¢q^~r'žáøE·Émz»pe(ñbØÃf¹œ^Í›¿«<¶zµc/¾ûYõ¦Œªaþ³ U¬k’ Þ„üþùÛó×ï¯??é°X‹‚,µˆ;|0Òoí/‹]<`5Ûœ ‰WÔOã⩲TœSŽi@!68äpï4>X91Q‰ÌdþCKY"{²,ñÜ¡ú¾µÅŽ©e@®»ô3˜æ Z¾çéJÅvß:oý]‰zvBþ)þ¢hƽ—-¾³É-V4D?V¢Æáâ¹Â0qÄdÕü2é¢þ‡Ö›†éÂvµ´5™ÚEøêÌ_1ºnúo$î×UÞáÓ`jÿk$Aq®!òT]OçÛ«<Í¢Æã ¤ö×i¹`óryQŽtÒyw‰ y!5níbt‹åÿÀ¿ñ £Éø§¬»ùœTÏINÏIõœd>çFמÃð§ p^;·ÿÞöpo endstream endobj 429 0 obj << /Length 3174 /Filter /FlateDecode >> stream xÚÙ’Û¸ñÝ_1•—pªF ÁKÔ¾ÍúÚIí®·âÙ­JÅyàH„˜‡Lž¿O_A‰vR®²€FhôÝÍQ71üS7›äfS¦ë2ÝÜìšW1Aûã þñþ•¼ ®Ì_ýí]žß¨x½·êæñõ¸¿ùWt>ß®’2ÒíÞüy»JÓ4ºÿßÿú;²èÝm™E½Ö<{ÓÁ†M´ÝÞÂ`¨Óµ¼åg³Ó­Dµ-b›Û?þýÕÛGOažäëKnî ?Õòj'ð^•©!Ñ“€‹ÜÄ[€hN´$…êܲäTìsæ‘p+‘"RIFo©Ì¡Àùet#L(ú@¦6 zÛÉÀ%K‚ ÅÈô¯#O\œ‡Ä€LÜW«O]/÷sõåbò‹ûÖ¤Œ±¢ ×&äy;séxEþHʺê$Ù$âDd™y 3Vbhæj˾Æ%Õ8Ú¹….ãß9Ùv&}@B¾ ϱšø ˜l/éÚÈ•÷ÞeÌ>S¶>Œ±®¤“2\1”õµ¢(ó¹vdXÍqôˇ7ï^ߣ“x|øðëGÚ2ÛQ^Ö\©¢š‹™LÕ€Ï\ñ€ ðs,ZãŸ_¸K°7˜jAÿÏwïˤZÉ\µ‚ƒ«æãížD9¡†Êb´ Â ‰,˜2áÐ,‘sIÃS^©žèb–'‰áΗ¯”Žo›Ä™ Œ‚Ü>EE·¦gõˆð„Œ}Ç Dø{*^Ô€(OÄ!Tz;cuý²\L ÿØlAo]äC’³mé¯lÓGÆ$X‹¸X×’§»ûŽÒË‚3eÊsN¸RH¢aDĪ©/„_ø<Œ¦Iì* (ûCª}z $]ø•b#¾~gï#ôŽŸOŒ®§Ê/Q—›e^ZËWL9(ü±4Qž3`¿&‹£‡v¹¼a½cóŒ;èDÁÒÞù}æ‰]·+ª!Í?Úy¡ìÓØEýx _?a@TYÎĽ8ˆßñ¦lçgN{qðˆt }S!ÛdÑoH4•gU¾P€’3€Iw¹{Xµ:rŒU^”r•ã"ø‚av*@£pVÏwTëÓ­ä×Êu¦’™†-ê¨wc*qçRìˆ*ñÉXãWÓIz‰€ÀK ÙðŒµ£á²Œàb_î¢g+r_½æ]Ï|Ž\çbˆM¶¸ÎÊ‚Z¹&@’•$4ü%¶'Ù6ú »þ…¡âÿx‚Oš¡^¹[*´*0d¤«ˆèp¸²öÙ9¶jˆ[Q8Äúˆ~Gø¸è­¯Ÿ¹ |]o ñ¦¾„ˉ¬ïMaÒ¥TWº /v$Mï¾1ÖRߣèf½ÍËyLüQŒägCÙçF‰ž»î" è«òæAÊž \”%´œO˜¶‰¥k€G—eÝò8¾y ÞDËŠtÈ@¬­$ìÅ>Ù{K蘌“9cR/|˃¾Gž/ù\ËØ\0¸ÌP¯b<ÇCU zÝ£––[î{y.¥…¯pˆùgNáæ›ýT•ƒJo0gÒ ˜ÊóxÂýuWðƒ>/¤¸N.¬®ç›Ì`¿wåË[VRÂæßS%»š3ÜÞ‘°œN¯E³»cEEGÓÖܰ·Þ^\9árŒ°Æ×ðH]YH-TJï/SÅr­âí\É_‹’äÞMVp_%Òo¼–ÃðÌ`Ê6QK€6.6ƺ¸~*0ˆÝd51Û’ìGÏï8ꯚޚÙ<꽑·þvÑOÏäSGèu\Ìçsr:`(  ¡±—õÜ÷stú^5gû[!å¿h$%—«I U÷ÒNÐ=’.Ì ¡B ñ˜F¡7§ÊÁ s˜8ìmš.šµ_Ÿ»L"YHOaŽŠ•ó0EžÏÐ7c”Š&›æÉ\"ï„ ÜéDyƒ½š¦Ò8@=›2ö=ÍVt§Œ—ø‚`L‰…5`Er`Å{k÷’  Dpê[ÆÎ·o]ÇOÞˤO™ÅEÁjÏÕ•& p’ÁuÀY%€Wì„;áåå!ײ¥+"_]ï\¿øb/*~\jßœ¨¸ynÃ~m ÿ ˜ºÝÍìSOÍ{&ÛlÕ\ ïM +a&ÎÕP8ª9m¢Ï“VÊh/•ØÕ{0àï”´B±|}cf$˜}Ó‡ +`6¾³K}È­ƒ=ƒ§E8{=û$î…ß5I›ÚlòE ØáRŠo1ïÊüUü²×ÀÉD&frò0ó§¹uH¿I.[ê±”FrM¸­Keìì3=_š­“ìâʇEù%¹H#ÉUWô­ËMjJJaù“J3ÉCÿz™åÂae›B‹ ‘€p•>óâ*y$BçyÕú¹4¹¡ ÿAjL•­Õæ"û8ÓvÝGå”KÉÔ;n,PGW½L[朡ûàÏÅ÷p%Œp¾rN¿¶{¥.ªoÅŸ|ñwÒ«ëb™ÒÙRŒ;ÝÆ.*#Ìåž(<8†îÛØUˆAò‡ß¶ã_+ßV;v.H„„‚”CZ.Ë«´>/6g($çss5 ±k Ë4A)Ü ¯ž¸Ð‡D0qðˆã²dœ’@`õSþ~忌Óe§ endstream endobj 433 0 obj << /Length 3099 /Filter /FlateDecode >> stream xÚZ_“ܶ ÷§¸ñKu3¾þ®¤ö)‰ÔilgêK:™¦ºï–µVZKZÛ×é‡/€(Q»º¤s3+AA¼è*¤¿è*¯ò"ÙI~µ;< Ú?\¡ñ÷ïŸEŠwCˆ7æ7·Ï¾ú.Ë®¢pS†etu{­¯þ|}<^ßÄE`ÚÚ~¹¾I’$øúÏø~ÿögn¤Áw×EôÆ ÷²£ y°;L{M±m×bÊvgÚ£rFÁ¶¸þ×íÏ^ÝNfq¶ÉÒäÿÜŽÃþƒ=EQ¶¡mÅÛM˜¥ØÖ­æ7Ü?]Óöªó‚ºQŒ{Ób ªkm(ÀŽæ€V}¼‹`ØõöζÔ}ÀMGãM'r«íoa”¥ô KÊô¤|’’C²2–Í¤Ž½ùd»ÓÀ¢ßDÉ&Ê"ld`!ÁhÚÙ í¶H¶ôÝ’  ý°¹¾ÙnÃà§Þ ¦ÿÄSˆxJ*‘URÒ[kF柮ÿ€Ñ»Ø‰IBiVöc•¬üx]$Žr’ó|ò ÒQàN¼‚ ØÿÖfúzÇÐm'Ц¡sÍ{xTGž§¼4µÕ3öœ¤˜E ¼ÏêÉp àãÀR~_<ˆÛŠ'ñ QJè0Ý‘ã'Ï ¸']« Ç‘©D@{ôM.Üv±ë 4º™N£–¸SÇ™€U¸ŠÑÖ_; êY¶ôü»=BÒÒ°Ô˜Ì$ß„i¹4“Wo xK'±¡© Úð+ÛŠdÎéDºˆÿYZsLÌ`¸ â _Ÿ±Y?ƒ+|¾AþðAx*\žˆ±[1ZðÄ·–Æ%J #LRCòGàý¡'ɳ!ÿ7*’-ù´œC$w¤.Oæ",# ÆÁ»¶‘ãE{眉“z¯d§ ͳfÁi=ܶ>UGèR’OјoÏ9äWêu}¶=Uêt¬Š,/ åä’¯÷}wzØc@â£eúFÐCU ßIPNÓ#ôg‡NhØ5Œó·S¯Qú¼¾‚† åjý‚ÙhzSÕJv ¡V6Å|Îe¸¥¼òÉûP .p[ºUÃ`¨æl"ÛûƼ˜*`¢|ÂD¥9É0ýh& Üw.i¡ö™,èD¹¤µžl+›aä ä 6¯OdoÜØ¹ @r7ùª}ì«æ^¤4K³M…‘K7"W©¦F+ö_¸”ã®;c#^’èT÷Ðy¢Ù5š‘í¼Àõï’FóåHŠÕBC`W3:,¦Œk._&I²¨i%S™ŽÕ露& ^VÝÿ-0s½jø zDÓè´è!×ÙÅÉI¾jü–ø2ÙºD<Ÿ-%É%èDkzïàÎÃ|ç1Ë›Î\AOR£-éHQ”AKv7в05hS\I…¸Zn9w:•<÷ÉMš~\ŽYŠ?2ËÐKñîu®ó)<é"–e /šß%¶ÅY^˜i^øí»7ß¼~ûúí÷ší½ûöç7¯ÞÞ¾wÅþ‹‰Ó5/1ï\IæÄ5+ž.ÝÎ!¼{™â»ˆ2¿ M}9È×À—šõ¹ h¤Ý.»ØýÔÖ˜°EuLL€:jRç-ëÒè[ŸúÀƒ¯Qòþ\“÷¯äA X…šo`n•NEÄÙü U,Þä,9 ­…'É¥/ÊÏLjm•2Õë#ÍÓ輎­ÔTEñ"µr3/HE3)¿€­èR ðRƒXÆõ/ôY ]½¯5) åÞ: VÂRßöÊ'7CCÞfB|üõ êyö\¢ÏMÄð ü’ŸИ³Fê kíj Wãb¹µý/Ë5²»d΢ÿ°jÃ2m*;·~xÚq§Et¶_†xO’ÔkƒwûaŽWÁÐDmzü+`ü…‡æÖ|<³HÃ>#‹nF{l”½àwdL—'xÒr¶ÐrZž–¹7ç$…rG/ã=ø"nUø 44Š:m‹œ,¹Ð’ÍìC츫róíKvÙ]¹‚Þz]jzÊL_îBg‚ yDæ:ôŒ!‰A¸!*1þÓl:éÍ;ŒiÆiÛ‡µj®Ÿ ¬Ê½NŸ¡½§®iŸæÞ\³X»T[ûñĤÊxйMQ‡gi‰Ç@† *ñòÆËYS– ´Ê€ùñ™Ë3ƒŒº-м’*õeǧ=;*Yú$·ˆÔepÅä‘“º¾$ž"(¿¼LÃV‡ÝPûýN§›J,;}Ä%BHÜ]y¿Ð§Ž7“º°¼A ™`ýïÓ0úTü{嶸ÌýÚªBÓ\`\^dÊ|žWÌ-Ä(ÅS~—‡¼'¤uZê>îÓ'íaŠ³Ê³bˆsV÷¯-ÿkbp endstream endobj 437 0 obj << /Length 3141 /Filter /FlateDecode >> stream xÚËrÛ8òž¯på2t•¥%>wOÞØÉx6±§M¥¶6{ )HF…"5$eÇ¿ý R´gËF£Ño´œùðœ%«³$UËT%gÅþOÐfwƃûOïÁ[âÂÁüçúÝß>FÑYà/3? ÎÖ[—Ôzsöïòp8_¬ROWóó|¡”ò.ÿÎßO·à ô>ž§¡×hͳ«6$^qÜëê]Þ™ºâ-ŸM¡«ƒ,ö/ÎÎÿ»þíÝõºç0ZEË(Tÿçu,ö_Ü)SË./ý(ä[Ý?+à§{Ô8XyE½G^LuxÄð,DÊ{9‡Ë×GFßãäØv<£=)îÑ È+œ¿ð¤Õ’i™þ5‹Ât@¾Äû{^ø¨ðWÓvuóòž7šŠW„7å=G±—7¦>¶ ¨³3U^¢ð@‹@-ƒ(à›mjR—H?õºöExÛºÙ›j‡ß«+ÍPá’¡×¼Ãt¥Þð²ËÝ?Tšˆ¥ŸM+4Fr@@/$:È—FG¸ì3÷xÞe(?ª?Ï€·Ó{˜½Ï{ÔLœÀ)(Âhåˆ= \±G“ãO¸ÒS’Û÷ËóE$Þ¿Ñ„IÍ€ã¨hlt©;Íã¼,¥?fFS1*:ôºÚÔM«­S´Ë÷´wDË8à/ƒTÄWqì{î>¾þ°¾¹»ýÊ„î>ŠÝ}øãËõíú+Ñ‘ˆ™\Hñ…ÒÀÛçxæ‹°qÂãOQ—¥5D*àn w2\¯·üe£„«© 9R nèÁÔÉÒÞqj™ŒÙ€|óV˾#ìª6º™l÷hZ¦%q-! ì¡>:”y!ö¬]OènŽyi¯w0ZhñÕüSêv·]ÀØíÅ àá]‘ý‘µòægâ85w¾ÊÀEp2Xí06¨Œ´>”áUòŽQ‘EúVEyÜ}eÌ#B‰GÞnÕ " ýÐ;4äNO¦ß3ÐìC‚·°“=oB²9–ZG‰1 3ë½üÐd!î°Í>‘Õ5àx{^²—”°2aXÐ9Å€Ç1”YÁœ%!¢‘,C^Š0BÝð°Ñ­$²|¯çÚqºÞcT–‘ÇøCß÷ôϮɋŽWrþLt†h›S—@Ìmñ‘Úc-&„À±ª‚Ãe" >ؘ‡c§yšlÒhÏåËœŽäB (1k N£‚tj“êpb³ÁÓ‚®(×&aFZq臎Úi?‰ ¶HšqP”˜aÉY:{ò[t1w?òx¶.Ç\Á„·Ô Ë@Eñð/ƒÑ½Ë› •»7íâ*›ÁÔXɽæ¬uùzàO$ð_"â§O÷ן.Ñ*10±o7ë_ù ›Û«ë߯ádøÞ®ö ·ÝÝÿëõ´p v•P¹s0¥f@¶ñKŠÂÁL|'¼†¿å„°3ñ3O’WO)ìñ>6[}È›¼“sH“D’0d PqÚ£O#çlÇ `“¡9…ºùÑ’SE!SY<™‹7çu Ôdyë8{êa”ï´{DÖû&p-%Æ (-Ž{{¨0U€ÍqØMÑ»gì „|·C£ëô{ÙUâ‹ï ÀúTV%>Zj{,9S#º 7¡Ý¨&ÚFÒ-/TµÐ8Rþ¥M5/•foº Ø›-:{ŽnÊN€_Þ™F#ï—–¡pj#;Øý8‘Ið™|È!:OPhè™§âÅPé‚—-Ò,ñ¾=êj qjHWsA;¦€ÑÊÐIµÖ(JÓ¼×é<°0†hb¯œA#<‘9ʆQ¬dܨPs®)LÌ–G’{ž8*MÓÄ»Ã0 ¯m&þÂ{úgêÌÃÂvmr©plæÐHaÆOÓðôTDÙÚÅÑJJZáe‰3Ïu9 9sÅ8|*ÅÍúþòöëç¡°9©U"ÇÚš¼jmêR‘äTKô@… E÷@51ø‡©@ŠÈžMgc¾ûAXØÖŽŠ!bÔŒùBµÂ‘'½MãÞQù ‹ÝÀ°Á§D¯לÝF-ÏqÈf‹ÈZ-)}FþÒ‚ôHh÷ôÆåtà›Šõ‡"hLîžòµo…àLj1< ÌνÈ\BçHK— ½V ²Â`ÚEÈgÛVTc+\†K™†‡3E â‚倨7eH˜±‡'àô] œHú¯±ÏÜsùò«÷šGàKÅ?^,9bK}Ê÷´sƒå©}`? –ïc†tåhf=j d¹’Œc¹Hú†B>SíŠ>,OTÔdÃSëš^L\‰˜°¾ÊùÓ¹>„€¡<3R‰ OÃh¥¤&Ge9)äJ[Ôà ˜ ‰·j’h5—?Éø%çvñpò /˜7ôT”È9,^™¶(s³·öOß²Ñʆ09&‡”ìôøÜÚ” KŒõm÷É`¶Çjû{»Ò´Ø{ ]=3€ÚI™}#dh'Á„{U™ˆ»™Ðk]‚¸¡¶DzÁãþžâfË’SÞͬNŠœrÉJªøbð\Q·!‡0®ÝÒW$¹wüÒÆX@…ÎÊö‡€ÆÈʈ(iW¤H'ö—ÅÙHx.CREý¡Š¦Ý–ß™k±P$ÝIÏiÉŤ‡ä0¢&Z¤Ôfl›àÐh¦œmÝPû0åFj:ÄlœùJï07Ói» ¶!žx?Ð`©@“žø¨‰aÚÙpÝ ”l+ÿâuW ÕL™ Àï~ä%6B€<¤Z¾¿CÆÐMÿZµ p°Æ;½B)(‰Ø‘&9üÁÔârùâ ¿hòj‡™ðÍÇPÑ­šI²o´_2[¡\ß¹¹}£B™6ÙU;•LømÄCÓ 0/ؤ÷\n̶‡™×Ê¡A·âœ…FEH`߇0˜{RXÿ,ôAÆ9µæÀ]‚·m)ÜA¼\Ì6?UŠŠÓ¾W*é;k©uIŒ1Qâ]V6KRÞuzO‡^í®Jz€c»fø‹ ye6Ôh[:–ˆ’΋B<~cÐÁ¤L²™±#U¬i/¯ÍFbAßD´ÎÑùØÕ{ðku1°Ê©ä1Ý7I%¾¸\µ}WÕ÷EU8Èk&zü*ÍKÛ8“@t!MT ‡~âT¨¾<á4Çp?•~&ÀŸL݇_€S(õSˇŸŽú¿Ê¾UýÔ½Ìú “-–ŠTÕùÜ+ƒÏ!o@@Ç2— ÖÂov†0«¦Röñ˜+ùÜÚTm—ó‹ ãC.!!rúÔœI-â3qâ–ws”ÚB"å_ø×Ö’)JRO{Ó#«AÆøI(.cà, /¯¶žÃUèá{‚‚i4ØIËË¢³†gƒ!‡abiDt×¾+bõeu^‰K÷×ÅmÔÄ£$¡âx®)`{¤º…ÔÕÊÎzÆí1qn_FæýÊ/®‰)lÚÙŸy•ÔÚÜLÏÉ7©Õ' @Þë¼jûGhm½¤æÕØ—f9Qñœ|Û î$ä¡îi‰‡Ù¦Ò—ºÑî‹ %ymì±hCòj‰ù Ÿ‘}Çó/˜x0ŽÉ”ãplÊHjNŸ¼cË;^y7Îj5p´ê“ÖÐÙÞœ_ñB©£B[áÀÑ\Hõœ4nV}%­|Òø© ç¤2²½•}+¬¸©6¢\4³mˆÎì5ÿ:üLÐ|ó¡Õd»-´tå×\*x:ÃñSfÖÿVë\ÇÛŸp²—Ñ˶\ùÎ àï²ÒÍdDHñ˜^ÞñèT!3ZcõL³Ë¼ÑzžtLGN5ãÊS¾T³Žs¨Á9ÂQRR,ÉCç6h¦ —ÉKû7ÿ廿 endstream endobj 442 0 obj << /Length 2540 /Filter /FlateDecode >> stream xÚ]oÛ8ò½¿"èË)@¬èÛÖ¾e³i/‡k¨Ó[,®÷ÀHtLT–|”\7ûëo¾(ÑŽ²{0`‘CÎp8ßÃø"‚_|±L.–«4\¥Ë‹j÷."¨}¾àÁçïbÙ·€ oçÏï®?äùE…eTÆŸÔc}ñïàf¿¿\$«@·µùq¹HÓ4¸ù‰¿¾à >\®²Àjͳ_:@XÕa§ÛK j0]Ë(ÿ4•n{Ø—EËèò?ÿxw÷8r˜'y˜géÿy·û/îT¦a+Â(ÏøV—«4ÐvgZa.ËÓ Ûà7 ^ëîp–Ö1œl0L°ßäÁ`v&”APÚI¬RÚòÝw²Îÿ9´1=Q$’½Ù™FYž˜–Éô{cÍpvæVÏxÒÞê^îÛ¢¥0È5Á²4*"‹¯Í×(N)ÀŒ†-µ”iF£oÔ5Òó„/ˆj»§FïÜ ªk+mÛ>D•ÁZëóT­òÂòE‘¬Â(I(„9¬…Q qB9áâ'‡¿ðpr(üäp~ k; ûŸ®¯Ù… F…+$t}Çð¹=„}¾†ØñÒèÍp}~…0VQ‹8ƒoüÙÌí^xÛg²Ù9QbG¼=N¢0A¾¿ß)gxY~¢v’j —‰–“}#”Ó[ÁÁ lQjÓ¦}>€£Â‡a.ˆqèq0žEöwØá¿D} °ŠSJ!x¸pQŒn9zàœ{öý+´ÑŒ‚ê*jà‘âeÑêÀÞ³,ªKNÙ D [OăÅt&' ˆðb­»¡fø×8Í:9DÑ)/¼Ð`âD*´ìÅ­÷Â,”Z1Ôóé,Ë¢À ‹å”¤zZdY,‚„¥n/6ãËàwÓ5MGA™Õ–EÓ~L¹=9Û¼µ6ƒ„X˜kÛí)M–:ŽÎ´RÏD£1'eDq!Y•D çcÆÃIƒ)”×_!ò±¸´U=ƒ¦‚‚à’IPøú5Ê#ªpÍ¡(žÖVmØ;BÂ,‘|ÈI«]¿Ên3ª#Œ)×Åà­‹<+¸l*ÄæqðÚæ ì× 0%æq0ÉyóÂÅŸS#F”×~Ç ÝÈ‚êâý˜–…W SZ˜¹"Gæ³ã:$ñ«–Ø·whðÌS¢ŽJÂ5Õ =žzJBèÓxH"’„=“’ JÂ’Ï;ânªBpá´ Á\”e¬–4~#Îè(ƒøEºXú‘¡â1ñŽH†ˆôã…§•jy¹ÄZ3ð¸5cÀ†¥Ía8XY:-ÂÅNâ)"q€’ŽåÄ\ÓS•œ¦…‹ž0™ý[/"ê©â)מ©¦œLð«ªJïÕV$è|‚óôÌò7ªxÂ8 ÛΚ?¸bÎǺø‰¥j…[¶Ü†v®(v×Jϼ–6²ÓÔ™OúZÉRMÇRM¾ãùþáãE2f‡Oªï§:™ŸÍ`ø’ ¸…جXUue'À×fÐïyˆÞÁÛ3&úéÖÛ#®ÓVTTÂpòE˜üFfo›Z¦dzã‚~š1û^[‘pV8q&E:znÏSj¤ ;]Š‚ê—È÷:û­g”]®š¾Zhq¿€¡~„@8ÚâmTe(z!SB•¤E"ÇWå@ÇŠ¬_Þ´p]S M^ÄöÑYªP—Á ƒ÷Îþq‹ùf¸r㊓7§%òCÿ<©'‹W~¨Ý¾ÈgàÛOŽúù›¹ák‹+J¶8¬GœÑìµÑ½ç…ÑÔŠ•35g`º€u *ªX’¤¶‚¾eÑŽâ›$L'“Ä]z`|¸õ\~‘öü̪Ð{=«b¦\'½ñIZhÙž9:{lD.ÃñdÏ¿ñÒ··‹Ÿ_¬oH&ÙèV…#°[«Al“˜ÒívÜÓÁ䆘¬ „»Xo•ô¡´Ú˜ofFc,ËsV2²R®`b9ÚŠ¢¯¸7V¼ Iwž´¿ÃD60”2 ãùQ H¡ä=Š{kÚÊìé½ ûFUÂÅ™f…ñC¶ƒMc&Æ“5¬)e€Ÿ ˜¾ê€Ó€PAv”Ð`¼æ´ «;å"¢ò$"ø˜„•¯2zÉ“ŸtÀèGÒ£¹FçÈ9ù®o¤×lÏÚ] …^¬ô¶^q°tïªÅʵ0àô²ÿæð| _‚E’%T± ËRúWia° ¬ÏNç+ÃÀu¾S\AbWf.ãE™Ð=÷ýI/¿ endstream endobj 448 0 obj << /Length 1346 /Filter /FlateDecode >> stream xÚWÝoÛ6Ï_aì¥2³¢H}uOiÒt¶bXݽ¬ªÈ´ÍU }$ñ¿;)K‰²"òxwüÝ'Ï|Â_¤Ñ"ÍËDº(¡¥6»-þ|Áß W#ηë‹×·q¼à!ËÜ/ÖÛ±ªõfñwpu<.WQ¨z£—+!Dpõ†¾ï?~Æ… n—™ ¥hwc@ Êþ ê%,º¢Ó¦&‘ßt©êyž„Þ|þíHãà³xÉù< :"ŸpmzÚì ÜÝã?§ä¡Ñ]§êKØÅT–U¿Q½¥9"ÿ‰vfë1©ÿ4œ>>°F ÆcNFõ†RãØw´°ò˜H[SUt½£3§Ñ»½Í-"J*åkÓiˆV‰aR-1üÛ·^fÛ©†»½ *®uW)‡¨Ø©77ÁË“DbØDÆ".­RædƵ9ZP ’2øÆá5üã$ixOC–`[¹“*öàd³¥ëâ fîEÁ0÷’ÌzsÅ%49,B&çÔ?TsÐmkËb áw×u§6´ÁLÇ/øôtIËn»Fßõ¢=øõµq f£·''º÷7Ɔ÷ÚŠ¾Þ¨Æ 8àóƒÅlšœÙ~‚‹[ÛKpuãÔ»‚$—sñ_ª9›É™˜Ãá-(j¿*:ì~,ìï*ÝîNOžq}2Ûî¡h<Ý€©âÏ“ûéú ùEquÿP߆P8eªDÙörÊuÛ˜º[]›{u­;Ïd3~Ìý¶(¿9æXQæíê÷"1”Ñ8y\ØøÝ™–¬  „ ëÈñ~ýŠ¡õ#~õŠÍõNè0,JA]¸pEøì€ Á¶—Ú¶‡›iÛKxî'Jœ6 ®aâÑ(IšáÃ&ƒåïž55ĿƗ}K[¼¢l߬L:’3Ûæ](ñ’F«¢tØÐ®®Y.å´W~áBR6%êÉhôáQtÆÃ~Z®¤ÄHÖ®›‘ 5XÝÎõ5™²$Ê©¯ÅOswˆó ÉëJFa«~Þóx²Pf¾wA•uƒZí{fL;ƒ+ÙHzYW™õT$á›qfjv®Š¾ƒVp–…r‚ö9,ž±,ÊŸÀêrÆs£!¡hÇÐÛ…˜ô—ÐEðüÀÌó}pbòT<+ 4giœQÉs H£anÀÍ´€2P<) <úD/)¼º¶yÐÝazÇ4Rj‹BD|R"’4VkkîR~tÄÒPÁ®ýh‰ç[ÒDãº=t—Ë™j"[ªÙ)_ÆÏ 7¬ùD(*x+ð°…»IŠðm{Ýù1Âéku×[dôF—O-å0 5´›™â\ºTh,3¤ÔŽÒè{]TDSÅáˆdwÆ]pl <ú¯Èêßàã)“„ìTtÖ(ðêÁŽJ˜ÂRä@ªTÑ" §\œoL`¹u ÌG0„Ìì+ÔcÑU¥*¢ºÁÎÀmš{£K§Ìƶôã(-<¼CˆìŒÔj˜ D 9Ó—¨=É-ñPt`A?[à佪ÀšL¥n~ÂA œüd¹t1vQw?Š`Ì:O­º¡eï“I»_=>f†…Ÿð™ÿýóD1—A endstream endobj 491 0 obj << /Length 2426 /Filter /FlateDecode >> stream xÚíœM“Û6†ïþ:jªVXâÈm¯o¹ì©x\9lrP$z²FšÒG²ù÷H@l‘l¦fc{F•ÃŒd°»…÷I£Ñ€†N2÷h6цÃõdq÷,+ßÝÞNª_~|õŒ†q37pF>¿yöÏ—RNhFlféäæ#4u³œüwúz½ÌÿwõËÍ&B0¢¸p†ÊÐÌ¿ûìß7Gë’I"O %ŽnÅ£]<š0*EŒ‡)’ùW'ñTáB1?0›Ì¸&\UÃþU aC¬R"  œXÆÃˆÅ³ÓOëÍ3Ó?Vùòö._û·ö»êYžÕ‚dÔÆþÝÕŒjZý`'¯èð¿}4”eF-äD¹yК–ÊéþdnRe¥Ä§ï@­ãó3` ÔêÓtRN5k‡b —ü$²8ºåø”™‚*+¯Ïéy~(VË6'LÊÍÓáäAh)í8ryAñŒËF@W=?: ;uRêF-Jˆ%…º†ç6u#–‡Ôö=N]1÷ êwŸ±òyWžâœdŠ^øK|!N:ý2:¸úy”·0¤”Iq 7Hm=njR·ÞF6wwóõòjÆ›®ŠuîãÓÍý¾Ø¬wÕÛÝ,M7ÛêÅz¹ËWùbßFŽº²ÀRýw2‡É>áxÝj¸pp…A•±¤H×ãÙk§ É´«Ï‡»+:]?g”wièfÆùùûó&eøÀ㥬 àRÂYe•Ä’"eg/¥ÔDQv”ò¾Xåy\«í%=€á&y<>µ¨$^2ÀXRðéñìñšP¡">÷¾ø³XßV9àûÍzYTi …”a${Ô•)²g‰36zÏ  {–YðLBIA¡á¸U=J·O¦6T/«ÇÅüv½Ùí‹Å®ÂåçLfnUˆk»{IÛÜØŒ0Å 8X¾È¸ûúŒ|QÀóE3T9€XR éñì– M€ª@ÕÁL›i7 Χ¡êq£'l4 ÀŠÂ‰*xåcI@¡é¹•/Üoîe(x^æ‹—/Þtt8Ü8g—Êä!Wª@…0D°3ö/ÀŽ^Sí<%Šˆ%½Ï<®‰•¼bµÏ·½3‘© Y¹Š?©ÚŽT×-(R –¤z<{¤˜&"6ìRÕ>ø°¿?¸Em_/qe[¬oY߬$T~ó¥†B˜°ñ(Ôp *T£(€XRPèñìQpepÆT\ÖŒšn¶wó ÿæcõsÿ›c"´J¶ùýÕÌ!±ÙvõPW•=ò‚7NÙxj8 PŠW9 –ž[U7n@÷xUk¸ªprZÀXRTíñUõxKå¿$–ýÇÛ,ªxúu üÂÍÜnWéoo%Ás4ž€ÚN‚â€XRèñ Œ°#Õ·èœÊÛßý—e ÿkèÕß…YèÔÇ+$§ÿ{wÀ`ÝÞ蛸bÉ&h¼üµ\~¨E×pKŠü ÏÝk8e$vM®—ðëm¾t¥=ë<|Ùj—ï÷Åúvwz³h æsÄWF€°šX7£Pâ˜Æ’@Ÿç ¿0þûÁñõa.íº¶\;Ñ.,#¯™ÅF@œñÑÝ`í6œÈŠæJ N ÇùDHI©ìG<¡Äsp¼iW í^º)ïó?àcŠ1礡ãóxª†T«º¹¤@sê¶›W%P¡÷ƒ‹Ðûb™Ï~-¿å7ÛË“ ¬Æ_`ýü[ΔÚò[c_%VÜ "é• 0€"Ç T&0–(ú<&¸áDGÇïÿ\oîwÅö|sÀ•§X@û/_ð'˜'âÄÇ¢6€cÕÁû0–,z> stream xÚ÷Pœ[³Ç ãî®ap Ü]‚»» 3¸‚»{p‡@îî,8! în—½÷{Þìs¾¯êÞ¢jx~½ºWÿ{­î†–RUƒEÜbn%»²p°² $•$8Øìì\¬ììœ(´´š@WÕÌ(´ÚVÎ.@Xà_’ÎVf®¯6)3×W?% àpp8x8xØÙœììüÿãqH™¹-J¬ØÊ…Vâèå ´±u}Mó? F??ïÛ¿ÃâVÎ@ 30@ÉÌÕÖÊá5£… ±Z¹zý¯-„l]]ØØ<<½¶—% òúãþ÷ý²)*kê)*0ÿSñ×$$ žN '7;€ƒý5=ïëƒßÿÞFÕ øÿŠ•[Cüÿ¨}=¦ÿQìþŸ`øÏp0þ÷^Ê×®µ0üirCvnv‹×ŽÿÏ­þwÈÿ¿ÿk—ÿ·&ÿ¿‚dÜ@ ¿—þ^ÿÿY6s‚¼þãðÚ´n®¯ yðÿuÕ±úgh% Ëÿ»&ïjö:â`Ðè"ô´²TºZØþÓ+ÿصþš1l¥ qþõR°p°³ÿŸµ×Á²°}q¸¼6äßKV¯só¿SJƒ- – '7ÀÌÙÙÌ åõŠ_‰àÃñ:‰–Vž·0€ q} ¼ç°†8£üuŸ<Ü6ñ¿Lÿ/€Mòñؤþ?€Mú¿ÄË`“ùC6Ù?Ä`“ÿC<¯}ù‡^3(ý¡× Êè5ƒÊ‰ï5ƒêâ°©ÿ¡× è€Mó½V¤õ‡^3èþ¡× zÿ%þW-fèÕÓü½zZü—¸_×,  ×KúË_wÅfù/|=«á«\ë?øÿµú*ßæ_øªßö_øZÀ¿_UÚÿ _¥€þ…¯:þàëØ³ýKäë ³Aþ…¯:ÿ‹ï^}__ý`•µë+ǬÿŒíŸØWÍNÿÂWÍÎÿÂWÍ.ÿÂ×;ÿwìk nÿÂWÍÿ:œ×Œ^ÿÂW‘Þãÿjt 7çWQ®¿ˆ^§àøï?+VVžV(Kó Á`»ÚàöÛjqR–íIáYÚmtFŸ%ç·{ ÄƯYëÎ×â)#½X«›Ò WbËO>-õˆa­Ijm¾& êÓÛm(‹SƒßŠÄëÈ‘ÉX4Åv|Ÿœ|µìa[ »hóœÜø0T po=úe=ë>¯Œ‡Îo«í|åyúøy†%F+Ú0 tŽ6ß<û;‚+ 9Ω'æÜÕõ,Nî· …f¿Ã®býŸœ±wß½×*59]º‰iˆõ‰Èa¯pƧé|$~§*.ø”•D¯ /äðFÄ /÷'~¯MLõA•È9¸œE8ó£b.Mw®‡E¦3HÛâ›2€Žž¢É'„¶LÖ:©Šz¤Ì$› è÷DM®‘¨ mÉÜÑó¦ûðX«‹™ óNF|Jã­‘+eN_ócTñªPNŽõýÉßÓ4½à8Ü´«@.®Š”)Å`'ÒÏòê—S~Ï’¹[úñšÇ ,E·ã¬JNßÐ,43è]P«¥D =9Ü6ìFˆ)aïq¤Ázñ›3£¼B ÓàÐflþ»5ãríæãTͪê¶bΣþ/­á°ËÑÎfw¢ ŒKà· ûüQO uQäõL,g–wèhÑ*+%Ób¶Üt îkGmV÷èm|é…«Ç·¬ós›še†Æ —¾Y¶át¤AREˆ2?0Å”SÊ ï¸¢ ùÁ¥õQÙDzÞBÝ“¾ØÏ™øi¹ð¢àGIµÑû£Â “~Æ*¼œ&÷ÄÍkÕêK>µ-ÖˆlÉÙè‚tYжþÛ¯ºªúóu‰ºh½ãc˜`º9C›B­ææIð„ÝÓu8VŠ™”5é¡yŒÜârlé?€Ué?sz<š ! rL,l+P#(½Y‰Í=ÈDL„Ï¿%ŸañHù”"Ëlý®®Ù ½sZ¶8³¶±úl/JUËøUïT²’ˆK\Ñ Å ËÓMÓ8à+`6}f—lÑLüæHBÄîaæŒ7¾×Ú‡Ã,]˜ölÇp~姯–Fûó5|/ÏQL.Óg¢dÛíöwriså°¦4ê»Å^ì!jde{êUMt“BÛ>Ùc‰˜N¬k­„zV;jüÌß—»x(À6§M#ðó,¬49ܤ2TÖ°Ùq¡Þ\‰=ŠS­¾¸l¢‡¥Ú:<í7ß:¾3å~¿‘¨„Ê[+êÆ\´u7¢a(­Ã¥¥´±DM´Ÿ•–HÁ©‚ŒµYxü{Û~7c‘ '´Ìxà9duë"^ xr³A‡ÁSJ´\ TÚxÛT¼¢X'Ú÷˃³& w\Ó> Ôƒà÷õ™Åšqsä@¥ª’Ëñ=ñüxFáÿœþ“Øß>øÕ“%‘3ßtz¨1í9¾ý Ñ‹¢Š™ÀÛk”>˜"è| ápß½…¤r7}¯IªP¢´‘’Èáì˜co´”_ó‚4ÿKƒ+Ûè®~’‹²æ` ÁÔ Ð—ù>ðƒ™¦Vû“QÄ•vþMêÚ“ PJä'õ¼A:ÑJ—œôO,O~Ka'jé¶è†¿zAyVÁžÕ™(š4âçÊË|Ýj‚ Ö6‡—&>_\ž ÌHº®5¡D]X¶À›‚3ÕÖ ¹Ž<åIœ°yQ#l.*)îö_¹7¦ú¼øý® k1ñ[~œ²…Ò×—BdÑÈ 6Vq:ö”Kùõ›êÎf%î„@¬ £kY%˜Ok‘B@Ç{¢{þKqiKÒ£®O€~"’ˆªr¦ÈâË(KçÐÍðä(I‘z8¼9§gŸmDÌ¢0Œæ¡2VŠÞÚ¤TfÐ_ÿ6>N-,èû¬öð¿9„—Ëw¶0òn˜çgá„@AžÕ>¦±=ô¿If7ð=CÜȪxÁà0–!‰í¦dØõ˜â"H¦Ê3GÖ¯f‡(ºlì6ÊM K„ä,Å/´€ä»dsV©íèKŠ´Tûð‹n†”ïҰϢǤùÍROR±ˆÅ*³,ûw-‘¼Ù¸1Ð@_W¶e‚ÅC÷“„|JPö³În®9¯®ÌŠÆ¼F59²#cX:>Fœ§<|@à¨< kÚõèò8äW:6ØlüD_CÅ•Îx¡'²Ä&ñBO ͵–*º´Ò~\Ç'¸nÚ0h*’ï÷½pª­xð ‰ïöSÎÛ¯zÇÍÎImCoQ·¯Ê}Ïã'‰ }x÷Rkæ&ÚÛ¥åFtCžC £¥.ûúz®UAG2?]pº’ÝøÊj>’"v):x£ KøóÔ?Š6”6{ ¤¡áÕ…ÎòôŒnŒ>&K2³Ôº÷^ÍÑ„Õh÷ð¾½M=øŠ§SņÌÛ—fˆnFM!´t¡=.P–ÁÚæ÷¯±ã«;@ÔÈ¿×3¹eiXä.ðI?æEQž|BŸ[5Ӌۉû.×rµ™ÜX >[èX> ¾¥iZVf.…ž¼u΂)§]lŠ·°î|%Õ.™v0ˆ!Éü”43þ=­+UTÂŒ\î÷Lý ×ò)—m¼nø—G’pè=©=ƒf½UwRç–½OºJ-Ò?šS:£@slüKÚÑ“¹žx’Žáº :'áŠ8³»aŠwbYŽ)Ù+®ÑçQ„ƒ©®®ÛÎ~è…KŽ@CF‘Z %µùŠoå‡ßÓD Î…E˜˜RÙÎî\G>At~ýOªƒá&£ú™Ûÿæ˜:²ÝSišp<\¶}ÂÇœò2Ï•tõ¶‹ý Ä*õœ@Ñ03³æ'îÈ ]ÙðÛÝãê0ÔÚ’©Ì žq¦þ:#W8Ø4Žtì깽Ȩ”Õ;;Ÿn_Š5Œ’&ä‚ûkœ‰§ž-§Ãs+èDɥljš§C•iÝ*8÷hä,ßž{  h¸2œ:+aVŽ…GŒ£qá¾a™þâ.ªý•h˜$†™hÇ!1ò˜z룈¥I°-¦¬ª;soÖ­Y­Íóe`œ¬’®±˜í$jy¯FÄ.D2"¬.BÅ·.«Ã”ü“¶Ø1_r¡´f]6½Áœ¨›ήÌî~–Ö#=~:Ñ «Œ æùqI–ºê—tݼ3†ó~%¾«iB<òØ"§ÎNàD­ˆhdU šU)3Þok‘i»­6Ÿ´é{o‘"ÜIcÔJ‚£ý~AñðÖI÷$‰1}á°Âß³¼¿Û\»ªà†mdFµ…PŸ¹ê¢M ÑßÇ/æ\¼™xFûˆöíW|h%É“H®ï 6[\ój¦C@\{’=YÃå5S¾³‚z¡æ»ï:b|˜ 0Äh¹Íçó(a{ó½V›MÒG ~ㆠ>Ç%ÙoSÓó ÚDW úøjæžd«![‘¤–ÂcUÏ»®¥?Ƨ&Ÿ˜Gí :‘NåV“L~ÎoÑrñ³›Oü|JYhÀ‹ Vª‰û¥ëCˆRîž ækxy!¡m4r}0oUÏ­Jˆ<¶ñºï­!S˜Ž”q]³×Ìcºg{ÓA¾^ÀmM•I}ÊÏD‰ôgv¥ëz¼æ6%_hQyCmv¡Ó«ßÃAsVÕ¹~ˆ¸;/À­Ì† Ñe¢^6k¨ð#ZŒ:Ͻæ³@7†½ô‹W lµ²&;•8XÒm¶Œ3°‚£m¶à¹¸ò^U€­Dúí×ppý#,6ù» 7>LÐ=ÑØé #Kfãâàd!“p–´û×ô[EuÇ8Ø} [½º;Òp÷ã´Ù2Üs uŽ»aKÖ¶kë£íf¼vq!ƒMò–œÞüùP"è¡/¤Ï®âµà7Ì«öŸ$£Ä6K¡¬y,¾a¤|F“í1Z‹èóå`ß 8 ¾·QªË£¤º÷n=XÛ‰ÓÙøDs2æØ¨UaÌœÙuc`ÆÄ qˆ’§thdßXXåð…˜µ|â4Hš 'ÌGÌ‹ÿ]pF}OëðVç¦ ê%pnsk’ “ž§DBʶ ØPÛûFÃb¨í·|+¼ìl¨ÿ»b$þRœ0zËÓQÙ««ŸR…Ö£æH©_ˆSì>Ê¢1'Ýc%Ó|Þöy³ zSV¶øqØc67/ˆ®O{µ2ÔîjŽ”2­§®:©æ4Ì(AJ ML}I Áͼ~‘€_«maÏŸKú=ͦ™jÙ6~˜[yÅhãé~mû¡i¯ƒS’KœE<` £¡=ìÕ._”¯®mO·Ž9n^™ª³ÈË6`J’¶ÃÐ"È-Ì49½ü®u>âÍ•ÚÓ7…ô¹Л«ŒH­Å~Ìãß÷ø¶¸×ÊI³d#÷ÖÁ=°‰Û7òù2cT›SAÊlé¢lD̤ Z¿ˆÄ ‰Jãú–6ÉWmÓÇjñ‘Ÿ DÅ ó—îàæ—lá±ðÕdÌ W 3†° úS\ÃRÂyÄxeç;£÷ø×èÚÒ+¬'~æ> Ë!Ëä3PY]w3kø¹w†”¸¦ „'ߦfx¢qùÈ»Â|Ëc+G±‘³{/î›JzòÈö9ÏáìƒÆ¿Í ÅN{ {DñôœG‡7áð.VæOÄË1Â*ýª ï ‹(‘5•£Mέ`¤жA_¯Ú O½ÙÚ„!'A¯¨á•9Vò¤cwŒ{g¡;½K>Yþiùˆe/^Qá„"Tó­~—´:´¥‹Ö„÷–)ÏYÓ±gÞ»ßS³Ôwf¥…ãWý¶õ1Hôï€Ü(?VŒúXƒ/ê•´,ªîãi#Ý!l,i]1ÆÒ½~ˆ}£.òîØ~©çÓsY›B/< N´Z0óŒx .4T”XØQN“]Wƒµfe§ª$TÌÒ­1Â퇪½*I?Á¢¡n‰ßÔ3Mê nçlÔ¶Nr“¥B¡ ¶ÌÊv³Oª˜/{5¾è­¢Ü'ÕÄwèN¤ŠÞö|–ÖÛ¸ð²Ð¦/Ååw:4ûR¶ªV”ø?ßÖ^n7Â\©TkŠoyž&‰Ô”GjaI Ÿº6ªä¥w/¦§àþ8¯öa Sá3÷”i}þ~™{žWÛÖ¢‰¸2Ò¤Pæë ï¹°N~·¤hJIÞW`?Ï»d"Ž™qÔÄ,еÉÝ]¯³öX (CNrŸöÜ‹x\xg[¬˜v „­DäÞ¤*Ã*øÝꥦ,¨t{©«œD5ñÓ¶ðMÃZÛû¯fÛÀGFŠw/h†ø¢8“s9”¥£Ì²æÈèÔ‘}ÁÌž<›[(˜‡Š_dùìÌ„66…9#ƒ°—k^9¦»çµaÑúìDdáëG-»´‚¶À(òEI/ÅSRèÁW1+›U¯½´‘¬ä¬É³Î2‹I׌´Ð -~»:m?“’ìÏÙŠ-M£;O5UŸ¥¢Ø®Y?£]³>™Æ|Ì ·=WGjælºŠ:eâÑ*9Ô×}é‚{s2í~TÀ~ïWwÕqÒ8Üñ©¼MC-ÞÛ™.Xè`Oü®.pà,B|–Jv±~/aš ôƒ×Ýÿîåö(a΢p>U^¬Ë¹É7Ãt4•c¿¢ym<_¦ôуÞ#VM’í׊=3„KëhŒ2J!$ž¢Ì59â“Nßиê{÷­ˆ‚Üak#ÈâÁ{Àaû“؆/!þ ˆT¿W®¬žYòcµãhÖm òj¼]lÃVƒó»ßª"lǺžª‘|µ?Q"E>ú•#³m$9И.9ÕâGnìâÅQ«Wm„,tq¾NC¤l]â3í†~…\Bˇo ),’ÚFLMøž#w&²HäCP‹oUDS"³Çž;ò =û‰6•oR±Å®L·>p9´Ñ~Ïê·Üü6U£–+ò:-+ê½Øñpâh„O¤·¼Z¤&$©êÌp•M%ìûYÍšƒoù™¨1ñ ™~Äälã/Ì÷ª—ÚÌe~f<ö`Rb›\oð§Ï÷gkBVÑí^8hŠMd®Bö˜5CÛÚ4|ÓuãVNìa*Ÿ¸¿$àÛ(É~ŒÐ§¸ô¶ä/Gš@Ášè&h}¦õ×bûzÁ3:yn'g I]&Ô÷~¿w¡èúL˜¶èuÂ8¼Iò ´ÁVÂnݧ׶äs¾qq»z0:ac¦Žæ‚( 0é‰8?Ú½ÁèOÇ@ @"ÂÖ˾°ÓÛ”,Ò«oÿôTÿr“QâЂ«oræÎ !‚¿r!ï.S‡c¨l.eokºãGp)`÷OKÐ+²’ß=íÈžúÐ*µã*§áºÔ#=W— Ѥúù5Ë&æ2„0ø€}t#‰úÓ×^GJ¿•…ªä‚À©|\ª@•å=i×µ†õq v2L1g`¡8׌¾‡»uÌWEòm£!!ùr§Œ®Ýü9¹ïÚ~‰Oþì_XÔ§rö߉â¶!•â7z‚eÂé7©R‘mÚ˺F3”‰GûÔ”q³«‚eÈãÃáx5·AëÆ;ëjRƒ¸r§ìá,(~d­q•ÑÜtÕŽÍZÆ4,¨zǵ²ÛÖœ®„zaÍÕ“alqZ[ç0¹(xÎT.šaˆ›OWo1š.Eví÷ØJ&Ê€ Ó|:?Þ'øÛØÒó` Ù:HÚÝÙ õ'r!ì²`‹gôtg{¨mÊÀ2Ÿ%âì;a¾8ßë×ãxèïÙ,ucnT[  ‘†Å_êÂŒG©xš9?“d{Ws|Ö%J_®>tqši¼yWMÜ{‘493¼"¦ÀÎP£›ýüDi™ Ó¯Ð'3›b¿¨œ­ˆŒÔªçï>r§ŒÐ1ú…r5öh1ù@ÛîßÝ@mU‹ÒÈé¿\åe{%³Ç`AvyKhün›y e[©‰#þØôü~‚¢5o?Ø1€¡TÖÇAÖ'V0„Ñ)ŸkÈ #…ÛÓA† 4d:>¥ž€±ïÝ;XÆhòË2Pˆ…Þ ±æÀ¼IO ӰĪa<”Òösû¨ÂE¬ü@FQ¡ïBjj¢nq CäÚòÛt¸·6eân؄̫XÕÃê$­öEñ¹±(ÁLQçÒÇÞ}5OîžIìÙÒ ~\ºO (óÒöYƒøóy#uÃïøº®¸Çx0å3ø‘O‹ Žæ~iŸóJh¸pûÉ<dž´Ö0À-ñW\bB`$ǪE¤O˜âÔi¹ì‘4Qœ5gÄoµïŠ+ŒN] <¶¾{’LðKTdœnÔ/ò5ÎþÔ²ÎC?Ì:ÑzÈÌ|PmnàÌ #’žv¾÷£¬ÕUFDÈ:>v®Â;$t~ßR¾†rù–!ƒ86›•´ÂP¦¯üËÄF°_Þs\æCxOe¿Ì"c8!Vn`ý˜‰ ÆÜÂ>Í €«ÆÙÄ@çº9Dܽ¤¯%G|¨lN³øÁCøù奊™”ôÂåö¤Œ hâNú-• ù9¾|%÷­0Ã^jšµ¬q·;šà'søD23©òÌ›Sþ@'9ýC‹š®|í%b§n¶¥ñ­ìlG|1\;SDóŒü¤Ñ2#‹@øs_ÿõ{;º2>Ö¼ŸæŒ¸ˆ_鯱 4T>¡Ànå¨Äü2Z{þJÎ+݃€‘ E–ù„Ìéô¡ß?3S q³t—MÕ<ÔŠØo2É3ó3˜Üv‡VÙ@°rÒ(ZyudÖ¥¡:™f±€ˆ²g ß-àfT _dç¥x,é0×Hñ)p¦³³Í¦ì÷J¯¬<Ú…ÎŒœO°Œ¬¢ÂÂûa1‰©œ•D7Ê•T¯„ú£Yû’6Ú…¸[”‹{·Öýá!§.­'æk?Ÿ‰˜Ò^×W4L:\ôh彉4Ï|é ÀÀÚЪÏÖŠsă—A¥›ä[—B­æ÷ÑÄcæÈÊ<ΞDKùÁçÙ…è=O~ÎtäW LãØBXåÉáÓkxX¿"òB¿?T2¯sêµ"lSǾ ‰–½Û<ª‡[ë!š¯sKËÄšò q€ÞE‡!§|ÐÐB˜EW3a{dUúáøtÁ™{t·»{®Èä`xwžpn¶øXêr<ûé]óuÔ±[#[]챟„Ý/‰ÖkºsJéò¿Jfºza§>Á‚Sƒ× «Þ+&V“ìø Ó´·"J't"«qXˆD7>°IÊ<È÷3Ôt'&÷¶¹'ÒödG@ ÇDH“5ö`Up¿# \OÜ_lw¶&˜ºø&¡»¦’‚‚ìÆ¡iXð/¶¸`­ß}»úU¼v÷yz(?P¹É;.ƒÍÛ¯CQ £V qá{¸ö»HøR`f¹¤hîRÇüv·õÅ77”¤fÎ4LfàL#o V^?2teQêÃË fñBAQ}¼ÚɤkYEëDŒ…í:ÿv2;µí«©ÐÞãÖò}Õ¬̃S»é¶ïb<÷ðé–ÓpÓµ+_V\m×·£ ‰²*©Aä¹sV]»-|âÚi (mÕ2'>ÓlܳòS=k}ÏWï ÖB*^äW˜•<ûå7Ò#ŽÈžT(2ìÁ‹¶^ÒœÖ¡ÆØ‡áóή®GU_R7-%°ØDÕŽð2ad¸S;è<32ú“7–T•æ-Çw]"£>_££iÒ—î.Â=½¹D£²ïTžïg±Ú¶[Æ3E;9æ("ʇh²zݹi ' ÂAVƒri^ºleäÁÂá²Xhïæ²Ü—oí?Av©¦f,ƒÎ©)µØN&c†ºß{Тõ#à¶<6!U˜â4eHn(­ð»µè”[ +]ýŽ Ë–ñõÏ3š+Ø¢WKS¼$k~uÂЈÉë~@2Ã=ž¨lª›éoÿ|—ð&Õb¿Ó¥Žt›gvG$S^ú¯@émpâìõéA»s»9'q’ÆQRˆ¦‡“;nb¢Ð £©~•?Ô;®?pwÌ{ƒ6ž¶\ù®öª¹ã1vƒè}Æ0q¡ùïN€¡§ÆÁ—ì¹÷aTÅ~ßÚ8•‹¨ÈÁÝI™¨JFãMž ¿_sdk¸¢1ß¡~¬CX¬-Ç&¹aÿÀ‹ùÔ¦§MEÀcøkèË4ª™‹Mªåù{öp»Í†j’I#y!bH`s8ú”ý‚m{M†{àNÅrá² uCóÐ[¹f)ı·ž+öõ¼Ph|½þcb-³>îÐá"°#yƸnfÑ.R»üîÊ…±^£Ø5!½È° êM½_¡áô”zúó ‹áNÙÓõ6K8.ê©£…êb W¤yY¹…]ÍN †o3Ïr„°¢’¿n¿Ü4Lváë…>uÚc¥8a¼ÅÔ­¬«ãíÒC0g;\FuÌSÜÆ^§™Œ‹?eMŽi‡ UŠÉŒbUÍÙkr LÓbâF~ãR¸"AÈÓ:3"Š©ˆ&¿¹ nñ˜«^\‡á7cTûxä-µ¥å>^NÍ ¨¸IÖûw!Ûg+z‰ÊŽ ±h-Í9­åس¹–ÔšCL%ΛýI{®¦ò¾.ú€.™u;â—´ ¦Z¥ßôõ!tð¯ÑÛz0ñ¤*ºHQ,±àeÕÅ„ŒÏôO;l߉z„,w7ã9Ïùb‡:; “Æ8nÂcbÒÉDÎSó£I?{Ê.GœÑHÙ‚{(¦…ŠS}S··ti`Ú^Ô|þØÖô1|é#¿>¾5ïŸrÙ-hœ šýj#Hrƒ é~zH*CÄBßúÔ-R'¯§ž žò<™%+úíØ¨C0…1^PùaúKcé 7}ª¾«S¢Sp^LÒÑßGÒGoV@øCÐðƒÙ£ž7ÝQ²S.)@€»™™ ç(Üeû– à„yÌ%êð«gö÷*T‚“¬.g8ªäPÁ;C¤ é‹1 3DŰÈjz@U!=d3¼Ý¥”;€MAíF¹–‘š$ñrRÀ½… ]}äYN›×v½(ztR0tt©} %„Æ„¸GCœOÍIG ¼Zñ´¼%ÿlKÔ·ëÒü=Â`?‰ŸÛÃ?7G?P@ Gò±õ¹m³×•ªžò¤#Í2ÑE b6æHÎeaû¬“` =E²ÿ+ÒE@ÇǰáQì(€ñk› Ó0hå³Üs&†°) i g·\&Q^%çïÍëwʃ¥Ÿ zßZDßÅ_Y/,‰†ºO­ònh1võ‹”¤Æ·Ž®1NV)Æ5ѹ½Èf1.~箋°‚3A ¸öT.¤þP÷ˆÇ’”·&Óz Æ÷ÓÞ8Å5g°¯)1øÎ”gÜaæž©ÁeKhÐôí–Õ¹(™­OÂüx·ô#ªšX@òËŠ€W«ß®ëg²N•íGŸÛ s‚8FL5ʪ‡2ÅÌ~äŒ AW—uÔ&eB&<¯aCFAe×@S‰u^úC¿.rÛÄÁ¨n4¾XS^ÇslØ¥¹q$M«‰µ¨«ái~óÕ@'àB6™æ‘Lãæ‰Û‚Ñn›(¹a&üþEÊ5âÛÌbBkòA\½òÂ?—( )‘ðÈJv2ž~„V/ÄÀü²^eY… h½ómÞI;C0ÜÝ l,Ó[|v>®ûŠ4y½õ6û¢•åB'M)ƒžƒJñÞ‡¬h†¸¡@†O•iÜoîx~ò²/Ûá[MÜz|”îˆñI^n›²ÁÀ×¾/>Lóò“0i_gfÛpè*x&GÍöÝ rº”Û‡ts9 nþñ7Ÿhh@h˜º#Qtò´—*?=… ³ö« ‘öü¸öwä@l$ü÷GO»¾-‘–´ÏÓ]Oðh’ _ª„ppóãto‰ 4äjÆ_ BÔ“ K÷ÇI §TÖ´æc¯k|¶eé@dؽÚÃlþ+€a/|aª²-LÊÎÔ¤±©]+Ž¢—_Fæ]_&˜$óWŒj^_êv§Ul“¡›ÚæÄP>ø‘J‹âñÜÍH}Õh ¿•;’v2®Ø¿íÄýp´¿ì úÞÐu: H–šŽaÌebÝÑQ®-uNà“2†ÎU›G8#(-FïYÆèHÖ—i$í}«Â=©ú³·½Ñ¼³8C÷²]ÏU=L¥áš…vOU29:B¥¾„zZêg®å½©Æ¹ËÁÉôʦìêM¨e÷ž`L¹—g±¦¯ xÞHÃÖB¶@à­‰9Ív¯”TdÒ3(FÎu’äcÏjóKv:—‘ÄoÄ€jóûÊèÐ)xr3ç{ÉúÕ®ž;ê7#5uß<©c’i µ¶éõ\õÄIû£Ú±X§Í¯yËsòÒ6d©†q4ß‹·ÊؘÖ@Š2äwhPurÄ‹í-ŒÁÕLªH¥„½ïq31ÜÜc—‰%íœçTr¸‹çàýÏÌóÖÄ ´ ­•§ëO+Þˆ¨hdƒl2öÀ\Îä‰Ì ”Žæ7œD¨Å¨,þñÜ~¥‹Æ«.Áy¥ïH<’´o?œ´lœ–ó”$*öéaù¯VžxLþ*º¾X—uËœ¾iIyp¤Ì=»ôÿL>3_`rä\r;îq&cô¨©©XÓ’¡C7ЗR¥ô4M‚†¼¨ „½¥·÷®¦‹Ï.r]Í7}ŒÄ‚F1'N¼Ú=,G#ºL“cͰkžû$„(-òceé07ŒrÆÊ!ÈiWXíf ó”ôßË6KZÏ!¹XÆÖåÿrþUY­n¹]±ês9êI_*Óáüù …¹ Ö ¶Ú\åàÄÀs È]*kqš/Eé£oœ¦ù{â›GŸì´7• 8pÆU)üB{FåÚ¢&Dñ”ß³Sx¨&ª£2wjK™IŽYc ö m‰ó„í‹-ðr’å3u ÷G¿Î}bþ¦LÖÔ”™®HÛÆ|.%+w¿ªÐ-€&ÊÑžM¢‘5Š—5‘üã§£èIŠdé‰ôÍåÊW³¯ß£küØ÷÷C5#H&°)©ŸX9°Ž´mÉ"& ÞO® ™}؇ÅÂÆÀ¹«Qµ·e´øl†S(1~ÉT’‹ÛØ7n àݳÀ’½¢”~H=\7Y)Õ,1W¤6ë¤ÜUËrÆÎšÚËåЈÞV½ÎRù5"@1‘leè¹þ+¤ñ’ÕçP‚†±cáç½ÒW’0í í ÿ÷¡ ¿¹Ý*~ÌŒ-˜‹ÏYz²ŸçôÉ‚ÒâÅÌÞFŒ0;ןU/>òÏ8|¾xbBϪîŸÔásYW§|/ÊÄy%,¼ßH 3kú¤Í×N¾5oÈT—ï ž¿qÝIaå¯Ùõ<4dÕŠbˆ@¬ýNÐ4asPÿEZçX{F—7?@øMm@d E èóž¶Ö•²»d9àÒ!e”Îå4™FJY-A+] ö¨ƒÌØ _ 2l—ñ<}@|ÃââꎖòÄ|ÐÇ"J5 3O÷$”‚Í?¢çL'Èæß¸Ù„2T1ºÉÙ–¿-{s‡O‡³@Ú…Z¦ÃÏÛ áÔ¿R—u‹væçtì ¤üNƒö@ëÄ+<pÀn7˜o» =ªÃ¦Ðò ±&ÊéÄ®.öSH\ÖåæK* 9ÕrØÄˆˆ¢ºæ½ lÚÙï‹QåáþƒY”>ÇîZß/<ô{>Á2W$:{[Þu—ú|9_Ž"Ûñ¸%J( l¢#C ãFŒqªVH‰ísüUýèØ‰T†vjRΧEñl¾Þ@ø_,Ü]'½Ž]I¢¤6kz4òŒÇµs=(‹" ꊶEÆB½4ƒ[lŽ}56|×YQå¦."^î×xÆŠó‡8™Xͪ>ã P8ã+7b¬ëµÃ™yI;Fɾœ8 œµDõ®¶€-úxÏJÜG·ñÈò2›úô±sE˜í¾6%ÜöÂäjLa+èN·{uçkÝ_ŒHË½Ž°t­Œ®6™IôÓ.¿w7Té ¼¹@ Ô  ªtTWºÍbˆÏ›Îß%`U%9yš×—™ºü[}ÆR0Ï/Yú {.¡ÍŽˆFz,Z”rzñ–ʾûmº+üA»æyE•a¤õ•aeF=S°"V­ 9» 9­A WÚâa0ã[GðFRÝ·êCwí³Çqc~·RŽâŸØ;/8…Õð>CñÑ 7;aÉ!áDŸPÕ%|EÊ·°%d»0ßçsôÂŽ§™ÐAa~³Ž*À®Ô÷¥¹«$}møÂÃdêœ*]"HƒÕé@YQîÆh²;Þa!êö"Óì8±ï­× ŸnXÄOòÞ}qh{ÉA@ÚbbRá=µ°$5ÿ4s¬ý] ¶­´ @kÒ¢ ×ö#‰ÔëH™.âB…κÓä¡=M°~¸røH˜ZH©›Ñäì৯zÙÐZàÃgpwTõ2ýû P”ßJD)г ©¤°€NY‹eXÐ]k0Žçmb5ÀJàÙ'É®*Û»`5ÁÕü\Lq*»`áìŠ%—öƒn>Q ·83GI"3e(ONÍE›#ÿ¾k’Çb¤ÃàI¯efˆãy§Mù;Á…Zä3Fð*ò,dzu›—5CŒy¥üg¿ü÷8 Aó=ÇÕ±‘k½ÑÓÔQ ±ý9Í·nÃ1Õìz3Ð" xQ?#iÒjêëH !]®ÞªðGð­lu¸ÞóœìÈŽ¹µýj ÄÚÌÈA(fmöÇSâu‰o¶|F˜µdKoGíÃÙn~[rd{ב:_äÒL|}øj9F|s…•*T?ó¢O“&•PÁ&¦S³®@›9a¦Ýõd+m(˜L_ÊÁ-Öj¸Q¨ÒkñÁØÌL•WÄAÌw@k‹Ž&/B¿$ùØWªÂð2ofÜVUV™ü`¶–`•g&ŒèQù3Ÿ~Ã2Ú¾f†5V¨^âN±`Qh#ÜÖÜÿ6œ± endstream endobj 512 0 obj << /Length1 2218 /Length2 16175 /Length3 0 /Length 17489 /Filter /FlateDecode >> stream xÚŒ÷Pœ[Ö ãnÁ!HãîÜÝwwwO ÁÝÝ]‚»{‚»»_Μ™É™ïÿ«î­®êîgù³öZûí¦ QPf4¶5‰ÙÚ81°02ó„e…4XXÌÌlŒÌ̬*æNV ÿÈ(Ô@Žæ¶6<ÿ°vÞe"@§wCY[€”³€… ÀÂÉÃÂÅÃÌ `efæþ¡­@èbn eHÙÚ€(„míÜÌMÍœÞóüç+€ÚˆÀÂÍÍEÿ/w€ 5ÈÁÜh:™¬ß3­Ê¶Fæ '÷ÿ AÍkæädÇÃÄäêêÊ´vd´u0å§¡¸š;™”@Ž 1à/Ê9 5èßÔ(*fæŽ+”mMœ\ À»ÀÊÜdãøîâlc r¼g(KÊäí@6Ëüm@øws,Œ,ÿ ÷oï¿™ÛüËhddkm´q7·1˜˜[òb2ŒNnNô ñ_†@+GÛw  ÐÜ hønð¯Ò1AEðá¿ù99˜Û992:š[ýÅ‘é¯0ïmµ1¶µ¶Ù89"üUŸˆ¹Èè½ïîLÿ>\KÏÿ sc“¿h;Û1©Ú˜Û;ƒ$Eþmó.Bø#398˜™™¹8¹ {ÈÍÈŒé¯*îv )Yþ¿sðö´³µ˜¼Óy››€Þ?<. €“ƒ3ÈÛóŸŠÿE,,cs#'€!ÈÔÜáOôw1Èäoü~þænmæ÷ñc0ÿõúï7Ý÷ 3¶µ±rÿcþ¯#fÒTÑS£û7åÿ*…„lÝž lV 7€‹ƒàý¿q€æÿ®ƒù¯¤‰-€ûïrßûôŸ’]þ=Ôÿ^ÀÿÆ’³}Ÿ\€úÏ ë0s0½¿±ü÷¹üÿ›ò¿¢ü¿úÿ­HÌÙÊê_zê¿ þô@ks+÷[¼O®³ÓûÈÚ¾ï‚Íÿ5Uý½ºB¶VÆÿW'é|ßAS«ÿ¶ÑÜQÌÜ d¬`îddö÷¸ü-WýkѬÌm@ ¶Žæ]-fæÿ£{ß.#Ë÷ëÃñ}&ÿ¥½/Ïÿ¦µ1²5þkËX98@ ;óû(±rpùÿ¢Oïùþ ÷ JÐ{å?ˆÀ¤ò½³UýƒÞó©ÿq¿#àôžÝðzÏnô_Äñ®3²µz?²ÿHØÙÿ’X[ÿñÿë,™Œÿß{úá÷ßcôÇà„Éønnòø—Òü;Û_ÐåñþÒÛ:;ü#Ü»‰é?à{fÿ€ï}0ÿ|§nùøÎÏêð¼õ?*{'ö‡9Ç»«Íû¤þCÿ^ºíŸÎ¼;Ûþú½T»?ê÷Fؽß¶ÿhË{­ÿ`Âò^«ãŸ|! è¼›;¾_–Þcþiìû•ÃädæúG³Þ 8¹ÚþÃáƒó?à;}—Àw®ÿ8‰wï$c}ïþ‡Î»«ÈáïØÿ³§FÎïO«ݤïKüü¯G#ä2BXš·5údQÔv_%øÑ•agœo†bG=™†ÁsÉ¡Ýù6‘¦òGÀ/‡[ÁÄ¡´Õ-Qê›/ËÄ/žGÍu°¡-ñŠ­O^Ïú_•¦vZ'±û'òŽkÂ0¨|Ùõz±÷Ró·„lȲwþ„¢ƒqïÚ'îVû³de4d~Gq·’Sñ¹dš!Z5JÇ¿p–"Û0}—ƉŽýÜ uöæv=sâXê+‚÷q4[¾§ÖoÖ˜‡9µ2VÇ.é€àº¿ðž˜·ËоVÑ<áW™#"³˜‘d~†18ÉPì¯@³äÿX=!m1ZýKªÓå­W.ãÈ(P`Yw÷á Äï{•ç EãmÐTLªT· ÔˆôS«rN•vÂÑÏt!CtÑ2YðÛ ®Ê" 0/)<‡ ¿)ÔôºðNg¼nªx: ñÀ¸RÈø›×”dÉäi°„žk˜,jEéˆLDäŒ%½”M=>·+œqtòªSŠ›s¡b–7YOv蘴ž?È—¯L.`+# i3,¿QË¢ûÖ,g¨ž.YõÕµòíb Ṏšcw±lˆBã] bGŒ»‰²{ÑÆ|§áïc½Ü΄v1ý· ›ƒqUrÎó42|ÎfÅ1sÓƒ"ãKÙ-Ý ³‘z…Þ¸MÄÐ]]³Û E㪴c+Dle{>·[ù®8;Š<sC°­Ä(ócŒ SXFn-%ع.¸ßKð©SÐyµx#8S9¤WfSkÁgè<ž?ˆ·g3ƒÓtù:h–ÅGð,Tbå€c !gsIªÍù¿@Ïïd©¿5§)é"×ÿàîƒÖÒJ#´ö2± ­Žó Ô±‘ ñ±II8Ü9AºÍÂcÖÁ{1‘AJs€Zœ‡Jló—ï{ó[^;‰I+ïB‡ü D=Lµ¼Kìÿ½Û¤:ù™)ßHý{ HòÀ ^Ñ'ðÀáG¥~jÔ¢ –qŒ¨¾¥éÎÔgr»sŒx’IRÂÕ+îÚ(%—Ö¥wñÕ8]º#P0®¬vÊ0<>Œu=Cí¯­®ßì˜äK j"Z •IÝ)³êËÒIvõ•H§9M Ù>*ÎwùçóòGµ,X_ËHü |€i”\ìy{ÐQ«Ó?aéùZèFJÔÄpŒvÙ~²Uà |²ü‰hv¬}cÕŠµ'h÷ ˜ºSÐx+×5€<ÛÉsž]¨B>–iÌ3in„5Ÿbñ"ü$˺m0ÊáP!{Å“‹»]›7øø»¼cÌç÷«Qú‚¬|Ñïp n}~…ÃJo8±¼âÛr~èÅÝdŒÄ†dØ8öø6ÂO U8:)Üè<ËxH¼üô>z¥ƒàªü•>Ð×}h ¸q’Ä30õƒè&fCa¾³Þ·ÅY§šï>Œ§³€9T'_ÿä×*=]˜ˆû´© n½Cf Q¸žJ- ãlùø5á»À…ÏL´K_ƒºß=.Dî>–š¿pǘcž7g]ƒ½º•ƒ$öIC8 ¦J”Hê6¦´£MgqVW#·%‰¨®"íyÉŠ¶ivô#&A=?Ý×mb“LËSÝÀ¢VÆ€°Oí€ÕÍÃMYz«q KÞ“ÿ#À”„s¡}Õ;:Eqœî–›MÍБ¨m5$^Qß°‰ÌFò™ÜÝžnc·ôyZª.ÑWð~×å΂ÉarnùG ¡ {•É<¼†~˜“€#I;VI‹œ×,KxÝ5¹øâ‰]A#ÁÕ̰ÓWâÍ\Ô;( ^5ßúØã.Q ëžœpæR[4‹Ý#¸ÏÎC‰Iýá…¾Õ¿¨/ ½[om_2¹¤jkòÛÓ¶Ok,„cLŸfv&P͹#õ–d…–kÈYF¾mœÏÐwÌçôYM þE8@R€—ã"QÉñ°îÄÛYÆ Ivѯ¤ƒ”+Cºcòôn¯õr;dí“»< Òóò2.Ï+ËÅ€†¨‡Q$„€€-{i7Qš<3w>¥ @Ïæ[“š4½æØ›.‚Óú{Fé-<>¿G¹ÁoÔ¨¶”õøk …ÿ³»ˆŽlÝen‰ÅsÅè¶¹t“kñB½gŽÐD²­%,í`͉:¬=lémå|=‚:›æ”rY|'úO”¹\@ä~cò×ïk‰ˆzNLêèþ‹î¾}¸…pWeìMŠÒž4K|c`Áê"mÆü­¶ø Ãe­4»¥D|ó ê…o2o†±^e·dvФœÒÑ(2Ä #¿< Q 2µBŒ¦ï¼ßüOh(pd¥MäYQ×*ü7¨åfëTã*ê@oí¾™Q—ÎHJ¥ÍîQ*–VØü-T¿k$NfÖ¹§h:Ÿœ«ºœé0­êŒo¶Ùëš<ŠdCã±ïU¤`´y Ë\ÆñŸƒw£ÔÃåî#e±h[«ä ÍÏNeL®LÄf™ sÁFlÑÆGõc$Y«È›B‡Nº7:í8iÐeë JL)ìyGûGزEIØs`i b®¾ƒg ªÝKß:­.…1"»A𘅅†‡JA…8`Ðê¸L<äÇŸFXJ"WïØÄ½óUÀñö¨R—³cmºÈõø!b§³æ©²Òš üÖýVÅî;\eåUâ*E¥’G?¶Ô=vzÂÂ?ù·«¬w4^³V¨á}­sü5ót‰êÛA!¸lu¹BN°@¿qÅŸ¹Še{ ý}™T"}¢e5 ÐTÊ:.„V¤:ÆE%UMÝpÖJ86uYnÄ¢ ¹·qÇh•¥8 n1$Fa‘Y¤P‡ÀrÚêaÈ:TQ­î·.Kg-ÝÔÜ?`BOºÊÄæ“ÛWùùé6‰+‡‰«»œoÄ–aO‰Â/b÷·M”PÁ›]ð7NA想.L%1îªL•y$Ï8êÊäsò_Áq¾<#×føwo7±²o]{°E™H‹)âÄ pÔ‚Þ–ÃÄ7]` ”y~ñHì”úG†Pï}7¹ÓJÁ¢²FÖx5ï´m¿7”_¬CÄÁaÎüîØ˜ütHþØIF ‚›äCŸ³$D$¼0Y7 ÊNŠÊA¬@/¨CRpý(ZÏ]x3A.×´Ì›óRôFj¡ݪáù"뀿x(ZYwœ>'óLºOrLk‚K—F®*þub‰^€ ½kË+é‚“ìcçä*‚/l‹lãéq(qÈ9'Ò0§‰)þ—xgí*@BáN§XÇÀpckŽüÖ¯ƒfL Ž©ÿŽ;†7ÍCHíðh‰«‚1‹£x W¨aKIR›Ï $ÅU#ÁØ¢$tûÀbº[xTfŸl™È—rÅÐbi ‰®l[“Ð>«HÝB¶(»|™Î5?hpÝ›v'{1N}ƒè9 A£pþ哦 z¿ŸÑ¥Ž9[FàÙ¹²¶ä La¬®zgíl‰gÎgÀ}©áé϶*{üéÜý´¿Ô!Þ2­aÒz-õ¡-{µã(Tœ× ù4†AàôF÷3ÃÕ6Œ¸·29Ð énÃi¡ÁÒ™êÌ5 í¥ò»»?˜Øarк]o+fs|Ÿ·$ízŽð¿»@ª¼þ8tûwôgžÍÄjCѽ,5Ý –†iµóCú@ÒPi[1fcÃ8 ~Ë1ÞÛhæº »¸Þh™å7jϽÞ1žU¸”ú×u]Tã¢!~∑ÿœVuæó¨ÙÐ#úxŽoÄc¿~½cZF¿r Nú>!=ЩÈݼúbjÔáµ™¢îRŒ ïÙ-?3=’2GÖ{q¥h-SÄrÐÌ Z'ÓÁÙ˜ÿ×Åç;ófÁú§áX¶búS)F–7ri³‘÷Ä69. Xs4¬©‰+)ß¶ÉÉN9¦<_ÏàžK÷6+tÄ\nTÕ ;ý¬N(Ü µMëfÑN‚-8}òÑ…g±VI¿}Ó³´®9sGmY¥ x%¦™¤°iPŸû!φ)‹–â^î;„9»çs¥eß~R¼Ll.™ìO^)<¢’FëXòS÷©d/‰æšØ<܉]+-I lV×z'Ü_mìë²üS¼¿_ÅM)˜ùk3Â%„”j–¶I•Š×,#~°Q(v¤?œ*Tý×Ù'Ùö‰Cx}nž­ÑÚ ‹Wk—›4…ë2dþoYp†~n—­[úw­#2½M}™ˆî¥!%ñUרSJ_˜"y½ª—»~é¶ÈÙ”g',jÇ\ê0\{ÛÉkŽwÊ»t¿Ü­Ý¹¹ <ó¼rUÔ¦ÓŠú–cß„@×¼ññlËÚ†þ—…¬¨‰$’5b‘’8a¥*Ty&Jå§žÔ{¹`œ¢Ü·ti´žº}yB$%?qäü¤°"Îö¨o-»*ó†æòã¢XlIÙó³db•l° §*/t…4äJD¿õø¬¹ù±¢ÓªKÌs±„ëöÇn>7= ÕA®–½ý—*ìp\LáȪSzN¼e¯KU¼ýmÖbÏû¦Ñ]ÏkýZ‚ˆ÷á¶JoÓI^-Û ŽûAY'MÂÈìt@S–‡fr~37{Å•c5e“*뺣ÁûÑk¹ó>»é|Ý—•¬u˜Çkd²s={]â¡*ÖÒáÂG2L4&ßúzö"Õ¥<¼Ò¾G;Õ­$ÀcM3øKcòoœÆ.ªGb¶ƒ|A.áX :ýÝä%2ñmAµ>'Ý‘ucäŽ:øyf¿MZç_Ð+׆Û8UÉUJ4§N jä"ª2(®¦ðLáÀ.ñU5(ÍÆÂ8ãå;ö®Ϫ³Vë-ãÞÇ£xˆWž<Ì岦ÇK_^ÜMÚõ•ßH—øŸM nñ…8Å÷^„‰ž5Nãê1obš5D½Áªœï‚ÔÑ[õ÷3­¬‹18_`Ìm‹‚ü¿‰ñÖÆá³Í¦^¤U7Jzå'"dúÌ-§UšH›[ºåbO=º­ë›ˆ3lKµ>Ö'–J¹ ù¾[­ÕGŽIËáËÏZ…;e%ŒPº¯Ýº89¼$ Xf4£€^¯4m ¬«Õ¶ÿaí_¡ý(?™0…gš/…­IôûÆS¡:Wœ¶ÑÉ'•³‹]ûÍø¢=ŸÀÄç´Ñ¦1PLê Ý¿øqihg!¡E‚ã«Sq¶J =‰ßH1!’ûÆÔmzg!oùAÉJ×" 6jñÜfáut#ýjë9Z!¦˜½Î©…ߨ`¦ ‹=¾»ìÒü’ªšk^ þ©wù¬ŽSWï.á\r´·­,>Ð5˜6U‰·û×åfé#ä‘ÏxÊ=eùSÈR½ |˜ÌG9îZq>:àx;0›éq!¤•ºá ¡rxæÍ»Ä¬ibp—p3צ}šQÚ‡wuÄ-yÓÙ(Gv¡h„óiÒæ²j U0ù9×ÕÐíªí;ä9¨GÉ:±g¸³ÿãwÑßm,NgؘÂ8.ºl‘²sçtzœw‹wf?;Hê”}%˨4à<²º0˜ÁaÀ–ÌV2ÖB…éV¸8|nßà¿®ÞlñˆûØr ¿ý£¾Ù­mòˆ-ÓžšNž±è:*(eášæ(Mó)Ü9)’# •FÆÐÊ?UVOÛ «Éoì[p/p»Š&·Ï›iwEvÈõÁj‹‰T(¼Â‘:¡AÙÅi7ñò§žš uÉ>p‡¢âL·²™AW.xsþ¬!YÛδW×Z&‹ò¥¬î,ÊïÐ W/“K•*]8Ü.TÜßçîÁÌ—åpdcæœRÉ …òs÷Û®×ñE¡3qŸ=f¬V9¹ œá´žƒVÜÅõÒ›–„îjd~@61¹FE’l¤IˆS*î·rÚZ¥ß`g“lI\³ß Í“³Xo• ’<–éFä!~YL룩d7¨6Ü‹Í껇î OŠócg}¼4»š9(mB4„ú6,Ž\¶#~»_'À£r‹'c[•ñÃÊEÝßpRÚƒ¯UkÚû~_:)ÉÄ>™oÁëq§5ðÆG¹NÁ‚è² ­Û…²¤¹`œño ÃÆ±Úmi“â`_áZ,û+“k–'@Ž–¯ìÌ0å¨×å ¶¹èS_eôæ@á)Bå'—€•¦{R[°ŠW’ŽÚV×7aî’aÄÏën}K eòZØ[r¢š8Φ˜0‚Ï0Q¿¾ëÌí!Cjò»œ“ò5—À¶}ú!#èûP‰Ë|aÜk°ÖækbS“ˆòñ€ OBmú4Ks9OúbZ¡Á£+H™Ï`¡ÉøM¼ÛªÅ¡ù³ø`Ëòüw}¼§;m±|SÙ)³Å>Í—ˆÆHn¶Ô(U~,¾JÉ ¬Gºè Yÿü3LÎͤUðÏ&¨XG$zu.ï[N—´!ƒÑo•QVú×Å<دt{†mCp7.hoô‚ëð™òs~ò/Oj0¢Îjpvp #Ót¨â:66çÑBš`ŽøÕP|f`$àe´VÌíò*;ø[õíš³  ‚s— žòÒ0üÈ)Å·;Í¢°q´¿_t»Ð¹cÌ´˜5oîü¾ºîïQb7o÷;çÄZ€7[õ˜?Á TOI1sùVð#)w"n[Y™YëC3¡Ë ß4? 8.1Ô=ÓT‹“ß„å‘u¡AÚ 8úô$ÏŠþ”0>’iåÐbÒÕºG{šÁ¾QÂý7Bâè¯&|ðœéNÜJ³ÁŠÞ™nUb}TzH¡`Û´`3“´©Fj?¯z)¼,-c¬GK!'îR6ÖöWl‹ð‚¯ÝŠÅ¥„„Š¿û#B…HcÉb’dPmíŒù\—¦ƒ@a  :® }Lo¸KíNþµ“µp®È‘GÀGóxó`äì¶DÄÎð¢æ ¸O†²§éK+­08·Øakød ñã?‚ë4Ü·^D³…„¯‘’[¯,½©pP²ÇÈ盥«¶¹}f½ŒTú½ß`•)O7í:¼æŒÌEì6×t¹—9[Ížskf«Çœ3 ÄÉp…¬ÓŒú•¡•·)ýM—mYCPÇ´cCVO};䣶¼LOZ*Q•Ýá‚xâ|ï÷J2´p¼b" óü.ºŠ'#]ëk•2`Ó:ªÜÈg¶äóvo)«,uÑ!â'L&6¢ç†¤ªv}RFNE¾Í€7‚ÓU%lUò[Fø³‹Ï$‹Ûö||ùIô­Ÿkk…xaI·I¬Ñú1và×Ðþ:êWt7Õk !œt$F¤¥Æ¨À˜BÌVÊÀð),âƒþ¦k-‘ö ABsÖóèèí  ͺ„㘤ÒÇÛ·Áο.ösÍ“S»·^Õ0U­ßÔ),ç.©ÆÌ[ÝŸú±Ñja[¯y×o¦óf &_¾QÀM:Ï_ª½ éG¶ð4Üh}!½_>­®Íx­"Ÿs|þÑÞ»›ÔE.šCdÜKŒE¾„èrìƒ Ö'W·a׃P÷¶'¸æÎaÅøIÆ+0 -Ýz*Ôo+ïñ:7ăƒI)où0PrštÛ—Ã#î´“«'E¯>î+¾KòåQµá=nLJÊÓØ­š=_EóýÞ/ò¢}NÇ9&Ê‚º³îÉgEóó’¥ò*ì9iᵉ/`¡ @ÁñåHxÊ­½ PÒ/J¾w¥qyo)¹…‹ UÏ>9?:‰9M%ôïª%DN{öçäµ<ÒúÊÄÃDŽ3 _É]#¥î˜žošÍyNyIKÓzäRJva}1š±ÓÕ¥FÓ?¯A:ºôÛƒ”Ç ¼îQæGryrsÑtœˆ¶~øñ º¦cÞ™§nÛæ‘uyËÝÐéÌ¿ô"jøN %õºwõôcf+}É[«Üq-ÍÏf‘¢)ÕŸ€‚A¹–t¢Aûâ¬x NÏ+ËrÐoQlžù¾Ñ/XMî*Á`hð“U*tÿÂSTRÆÈ«oÅrÜ2n]¢Ca“߯x›ØEàá›[ nÞçóÊ_1±ØñX!l~"âŸÃûŠä§!\tÐ^õl³—…w÷!™©¼ý‹Zòüsó-¢QãÕžϸKÒU'¦âLÑ|Jí;ãßµtâ¹…¾ërUÙ;;¸®œÆDÍ”"²Â'pEx5{ÌD½4ëµ2è÷snÂ‹Ù¹Ç & áƒÑk¢mŠ ½tkéûÑâóÖ¥–Ø#^l…@ÝK¾¿jýT>¦¿¨@ç[×ÕŠÃX)¾ ïHŸBðØ>Þñ Û÷ä$œT…¸JÕ\÷or9þ( 2—»ÈàþÃy²¤q÷6‘Z‹7tÕ–u[7‘&v¹\ëDm‡]K¨w5!Šß”‘:ah³u Ì&h”mú¿çeù×’ˆ‡­~‘:A¶K€9¯ñ ‘¥Ë s&/ˬºÇâW‚K|»ú‚!”½Â[Þ—Ô·yQ<.ƒµj^•슞å¸yn" 9".5G Ôu­&Ÿ‰VûékÉ)¶û=×]8“]öR5×Q ›‰U1#lymH×|eúÆ’è¾gɵîî™òqÉ8r[*¶ ?%LÀ¢ t+JÞTe°*%ëÈ›»Âý”»/e2z:Øõû¾¯ÁpW†d1žæó®Â ƒ ‰9ÈÈhÿ”`±·¼LӺ݄ýKaCü¹³ ª©$Óœ‡¢sµ g×uÇö/ÆÝ6¨º¨·¾7úï}`Ð(ßuÐäçQŒ=|iîJZi¹‡z¿_Á/pú»ž,v)õj7Á]Ôp£…ÀÂå§¶ÚcJúµ@§XhÁ¯ÍʯO€­ŠëesÖØ<«dÈöQŒ1¸6™¸Â—Ä«dNAlþfvFë)ðÙ8 1 ‡ábþ“Á ?ÏšÜZ…ÀUˆ¯WϨï uzÄŽÝ1÷Uq3`~Ï>rÙ0«ÒcÙ v!åíø"" ®{KÚÇ—9ôåi¢ÉKy¶M(PÍ·{ gІúÔÀ8b ~[I®NÃàŠïÈ1»£ã¿÷Š56H¨µœ©UWK)NSõ8gàšÏüyCʘ2l™ñiÛ%"U]–Šr¿•÷xÑжêò©/M’ 7¸Õ[šÀ Ày+™~¶îeŠÖ @ÖRÒ°(™t°ù± iB“Ÿª$ Æ…k)¾mlÙq³ù ªr@9WHþ£{b±CèP¼Y~Lä„¶ö«n9ŽzpšµÔhGýTÞÛáž äÙ7oN'Þr3±ùÐ)Ø’ôCLûÚ– I´‰0í°Áð×Ãyt=Ô¤76oœWÕo&èð5N¸ íjb†õÖ}W’’Dp©:f %ØÚŒ[  ørtòL…î¡Ê¼“vAɵ'17UÈ¡Üݧ8‚È$ç4™_º9Mfzß@¹úõªE©LjU(vzŠúKh¶e¿‘æÐdŸM°¾¸Æ Äë+Œ„¨zþèí&ß—¯äG1ÑK­V{BŸ.”äc|Ú „l¦ìê$o¼CF=ÎC'CÉâ(JY_‰ª’àƒ¼ÄÉìÝÖäÅ”£À˜»ûÕúB:+;በ=ÂÔ#@Fþj'¾Mì{í¦h>*ÈXƒSê0@m6‘±r/õôaã»–+/Wñl¿îOÖ¾È+aÚÌÕÓˆMW¶Ž þ•vUt›X%CbeñV¼× Ôî5Ú¦S4+›Ät JÄèÕb&ßUˆø‚f{õÁ¾6Pø‹CÝ·ötÁ„5žX¹÷ÊèÂwF'.ð 䌑³Ÿ“5® ô=]3*Ê‘­ÏäŽäé\‹Þà¬%Q¹ˆë{Ëksñ_Y†dˆe—e%a?åò°ð©ûñÌ)ž²BûÖn[‚Ž©ºtYƒ79çÎ’yM[ds1K×R»ŠŠaGåqw’0 ¯^¿‚uù«ò“áV1w…ç>ÍÆf€ƒ’]pµ1äÔÈóm;0·ÐFê26ùJ®PQÄDzÁ=ŒK…5‡E+7ÙH§ÂÚjl2_Xœ¬bŽ¿ƒYö Hî,ª‹æFîpkW¶6rMd¼ ðxë.CÈSl&µ {Xn@\C‡b†`z4áÞµ ß~Ф¡{ò¬qäht5ÃgÂlàTø EBŒÛü›ušxvö?#?Þ~E8i²å')xwïY&³~[Ãh<=FúA8«}U5þ@M~hC F~EoUKœK¾w#j[|É˶¿çŠ3~¾mƒ&ûj2'ÊÑŽ"—›åTR³9D¯]_§D)×££¾bê ŽcìÙkÍ]dj`„6ÀV¢˜*qÒqÄÔÍDzÚw³Òƒƒjëë™ö@¦Ed˜!ÑJ§â¾o œ‹Øos±À¬i—Åñœ-w}ÖHiåjÄ´4Í ‰ºŸ~©î›¶™ôq–q¶ŒÂ=P›*óžoþ”ˆü )8óÏ‘V2e³_› ­*Ÿé†^GaÓýÊæ×•ÁB?]u5ÍKRù{M¡bN`[’}™t…Kôùùô0tê“_›!_Åu‚ðtXO›¶=ü!ŒOPLÖ»\=œ½2¨hX·ûˆýœ;ŽxðT!ë8ÔI½ÅàÒ—ˆ‹æ³+†e¦½àJåP 0²ag„‘)’Ú?™Ï~J~NHÂ踼 ý¹«îràúø üÜÇoíL ã†äÒútžÆe3šŽéM(IRÅA“­ü´"ihÔ­­êÓNölãìEVç†ÃÇ Î€`¥ÏwNpÈ_î+ðåÜÐü0aˆrƒƒ+ÉõþrÅ¢¼Ý«q¼Ÿ`%ð#Y4ÔT"Qõ Ø’F"Fƒ•÷©±ép¯eJÓìŽfì–,¸£Ð¾Äð;<ÙØx—¨›cžÜØókX1ãÓ37ï’ ‰)õ¸ ¡ãN:DOú² $qÑTÚ%ã"¿°ÓÝÃ6#,›Ý§@q¹/çøîƒstÕ”šc!K#\|+•ýôC#ºž´÷Á ¶œ#0`‰dqD˜”Ë.žiŽÞØ||XÒDg\.¤¦uµ±l:5ƘÈr/gý5–½Ðó1PÖ9…¼ì\gT ·õ†0 õ†™¤¸¶v•âÚ—¼hâw#&¾MeCûþøMV~«Ç—>ÌZýGBE:¦OË';‘ÏåË,¶Êöb,‚¤ÉÇqÃ,àyCŸu¤9ŽÝÒó=ñ·±Ÿ¥.8ËÍ Œ’!û ªÏs®++Âïæ+Â~v“¤6}v/ýŠžŸ[ÓfMâŸ|È~ë‹w6ºÎø*Éþz?Ö£*1º£åmŦ+ó1NjߨÒZ‚;è{b!™Ì9ñgìž/ô¼«K;Qwa%˜›ëИúYq³$É‹>yóÖõ ®dºxÚàaÓš½µŽ+ŒŒ›ÆÍˆJ‚–ÃèÊ*».èUf6ÔÌ5B¼xegد(¢LÂ:öY5è@žLHËûKû+¨ñ´ÅX¡Íð¼i°“zÃ3“3B®¯FÉOlÇÔPû}5±Œ´/!„zb_~GÝŸE-~×0…ío…u«ŽÙc-„óÖѼÉÕý^›—Ù¦}Ø•_ê[%˜4T~²ÁŒÃeŸÂ’–àÚâMô£.‡UØ#Fí·«ô¾²éŽ^è‡b, ¿­a‰lõ*^»R"–;d!¹l®\ŸZ͹NVò}¬M¹r!¿«1=¡l*¶™w|«´~0¦,ÒKÄÇ OÎK‡Íì.@¡þVuPÔT)IÏÂ=üÄôá»7êι6ɧÍu /õã=>V„ÎHh—ËïÊ]£ØL¬[‡ÿø$ý4‘ë­Ä_)_e‚ptÔÆULØ‘owuÞjvé ½ú€·ì–Vs΄S óéèh¥°³ü»ËVõdGŠW¹&‘ÓuþŒWÝ™Ó@¥Ï²cÜ™Àkþ<ö‘N´ú!Ö(¿¹ÔŠqÇôY@UåGäÑÒPõì,¶-CX)o…d?bîÊr‡¶‡^ªÈ±É¢ñ64>¨/ Ö†âÖ'À[¾Ñ§µ5@H'•ŽÀrçl`¹Ëˆµ1äP?BT=]çûie©qßÿÁÎ,äuëruÍŽ‹UþTÉOä ;bÌJ9¦&…© õt•è›ÎfÚ…êOȘÏP–™é2¨ÔÅZLÃèÇƒŽøá[‡àt]$œ ñFzÔCyeõi™–óìÞ@k*{±±’¨wšÉœ¸ mß®í¢9xâg­ ¡ôTUÌÑcPò‹Ô‰iJ’sÍ/¼oT+naC_F6ägG‚oÝ›'m7VÅ^‡€'žÔØþéÍE^ ÛôYi"¨ÞçÆ üE¬Ç¼Wñmp¸rgÛîí%ÜF0VÈ5½Í7¾øñã„kC& _˜~Vfp«°Ÿ¦Ò´RaªáÄ4ŠÓ¢ß–±-Ûrg>jIkÞûMÛ»°{þvö×p40è°ºÎê $Š2*2ç¨FUHëFq î¢Jª*½&Ò†ÜzEïõV!Ÿ²/Âw3ûÍ–X¯øòÛ”»Ýб•ÓGp#”_éCö~‰m[¡r·—w·Ïb&7HöÉ6ÚÖ!ËI“ßéƒÂ#/?<Ó’µUëiðÙswµÓ£±â=[ô!äÄ‹#>Ä‘,†T2V¤…M1ì:ÊCЪ…Ã?ŠØÀiÔ_Ží¾íêR­Þ®c‹õ7rôÝ*'c!€îó¶v…ø¤-:,Ç`¹Õ‡hÃÏ£B°KÇ«“€[ªy|ÏîXPlÓÇÝêf=Ä ÷$‡ Hßá97^÷5ÖVá_0?†¿f¥û”x'žÇöõ³ÖÃ/ë¾âœE¡tƒivÆyRÇí¹|±«õô]®øl¼©à¯:Íò Á½SŸe/2¯- ¢e«àx¨”ä&01]2aÓPzáæ ä§PRu Ú#OyQg'®8饶µ>Þ ˆüÊÈülk ×3'¥CÃJta˜_jå#ê iN$aƒ®HËñLm\^½tN¢°ª¿Åø ­¤¤rµ·ÍË‘òKbkNªÊé7ÃjZ ž)Š&J'¬ùÐt…r´DFû§6‹¿~`ÝÆ•9·†'¼åã=µÇ ñT¿Mù½>ŽìÈßæß>Ö¶G(LXBáçG¢Ó4öTCOȬŽái5´dFÜ{öU*‘êÜàÝÓ­~bž Ã˼¼ÔŠ!$¤™ã˜Ó$:éïÇu›û"*W{À‡ÆÝ@~¯Û~WýÕù óEDÜ¡q!Ñš§óGpø>ñìrËK“ˆç,¡ºÝ õeêBÐ4ššky4®€‚Fj‡»|—´b*:•鮊dä~õòDòUwø—Øûc!PûÚþ—+•_(0´nÛ38ãÙ¤B¸Ù±ù«øGi^ >ÿéÍŠ3×HÅ FÜò ïªòÂhïÈý¸•"F¢>”¡79 M¶X´lczUê ïÕÇ7ÙRUKžå~1Å—C#¨|¨Ú™uQ”Qü•LÝW¯ *,`—Ь§å v+oÍ0¿ÙäÞÄè÷Zž ™`¦,&15h¤;ükÉéý"¯öÏjõy”=¾"úîÅÔs}¨m›·Kb©þv)ßÇRõ£ØÉ§m@νŠH°tOo:Ù—es}v?¨‘sOcï3†'««þ˹â 9½” ÁTÇ[u\tËàÊT÷k‰4¡ÏQèNþØ`•LÏñ™2Å@÷3;¸,Á‡/jšÌ‚+øÈô~–ãIèâ¬6GAøØœŽ9xšóÉIµ+Tm/Ñþ‡@íÉËþ„Ì—œ™vV8 }‡ažªcAžžùvÖRg•° ߟ?ÐEÖt¨ß0‹•ÍH[ÿ¢>£¿Ô Õóë'KûxÕ‘u.ü·¢Ø<]!*älgh² xÂ7kÑþFýI;‚/ŠJ7^!þq'iÌ{,³ò ¥â ƒ8 EŒ±•i»ÝÓm½EÕÁg OÊ×ÖБهE…ï˜ð7•²£µ ÛS$î."céKA`ë$ø^=rXnÀ†ŸVuråŽ.]Sf û#íîD~Ó³4þé™×‚%¦„_iso‚§,¬7²ìÖÉiÄHð>MXZƒM@/ƒ'KšÌÀ¹Ï©-KÐТnâÝíµÐÅÍ-Š™r˜wKWeœÅ)õ€$¾°"Å@–g8Qè~ÚƒŽ Í~=›3‹Áw*nÌq5׸¸¢7¶^ÆpšÔÈ.çQ¥<Ã>q€½»ÔmÔ×q YÄ~É´ìŽ(2%¹—B‹®¼dWѹŽ=¾Tî¨[ž*d‚·#¨U{Æp ŸX,!ÂŽÇx‹úÝ-öcý’)ÜJHÐxûKÝ4{ˆŸþêÃÇ¥`—p¸ xÃÀ_%Aã'“Ôÿ‰¢õóoðÕÁ-®ÃáÎ¥óù$o?ÐÈ|\éÙÏ?;Šz:ñë×÷Fáoø:f Í`àˆ$‘ãÎ D!œÄ4~3¨J½N+&rèO‘GŽ>·[œ6Ðä2Ç—-`¿šï™*± yf5 }×ðÙhÖ],¬^Ží‚PÝ-ÛnÛlÕ `oðéÃKŒÔòê§ã šN-ÙPf¸My?L·üÆ’ô«þM0ÊayàB‰=÷ý[ß¹=›u²Ny°P÷R¡º‘Í›L.è‹‹í%æÙÔÌàCoÀQäkQÃOÐ^Í£eÏ&ëˉ†‰¨ù¾Ì©œÔ¬Šu™ÐD—¼I¹÷è‰fiîmõ¨ù‘Úš–W¡Q™Ž/ê“ThÀ~4‡$¹ªsãí¾Ì£Vâ,µ!KË‘wòRÍM±¯•¯ ÑÀ—H°Æ1¹ƒâÁ íÙj,¡80›RoʃqOåùïüñÑnÐá ¸4B˜3jŠt²oLgÞ“04XðŽ¡Qß¶îU¼PDÝ׎¥v¤åiµã-Gx*©%ÑQ‹ƒ&®Â÷¢‰ÊÏ;©æåâÍÑŠÁb9d.Æp,ùŽpãz!ø?”RKÊp¡KŸpÆHôX4¨Ä&íF‚¯Úc/ŠÄÈrM]ðTRöq®¤%UæGWõÚ9( xVx…Ã>BÀbÚÕˆì±q|±Ÿe§N'»Ö3úM~ò¦—3^uÔ¥)-¾Óyôã¡oÂæK~ ¡uq¤™‘üŒJK-Øvmæ‡LC_þÏ1.d*2åæ,“JÊ—‚wµqêÉ è»”æl³*ã^èðe"¤°$«,Æ©â’øéW¼yÂZXW4ôó oÊU4£yT̪ðn·ä2åÞ t€ù·]:¢Î)œÑÞ~ð¢(»—4ÛÖû£oy$¢¬‰~K½sþù+&Öáâ·–‚³ndbµµ~ëFûTÕBŒtK˜Ä]—æ•ïäÎå‘õ˺[­Ç†iÙ¡ž¸dõdwBÒ•€›PôÆhAj”wVF̤3{/'EÜêA‘q3‘SlŒŒ™JÉs„½ì!øɤܩkj9Â%?E}0óŽ/Ï‘À땬æ]ØPµË/SWRI Aðmiëé§9e=a¶ÎþÓ^: ÝALÑ­nÃÌ|î_ÚHœ~šxç«,ñ”úŸv êa¦‰­Ç!a÷­gù±·QÛžèà?Ö†â’Åf}/ðÖ\¾ô£P"Yø`xa(î#—¥ûAoã"zD`.zQ†N)@wçÚšR _`7 Ë|ÓëÈîC^L»'uÄ—ðYÊAšú<‹ O"« |}‹¦Ä [âP:ÝÔoF£º¢º ìÜ›ßg´÷‚Ö2c+ŽiQm™”¹¦;X”> LòD<µæ®Ö§e¥@‹OE~ ©³\“ævr£Ó˜_·´hwæÛkï ¥„f^$È¿î v±÷LÆF(bŒD]¼BWr]‰˜ ËŸ>ô6ÖM/]~ŒfŸðeÿU @“l¥¦~†vnwa»h«Rxþ2A/Éú´5G$U8©.}yî°ðC×xÌ¥[ö=þ%>¸Á0jçT#­‰#€hÒz{ޱkg®øˆkêªnžì}ʃ–C¿ªšíY³—ë^ kÁ¦Å‚Ê ÀJ„pfex¨ØX¾Vd?éTs~§ì«ÌÇ›úàU¬K”ÒcTw³è‚ðS¬Ûnq›ßQT#†m²e¯2šTCÆ)Pqœ;Mj ,ƒÂ˜nϲ„dq…šI‘,h‡øû·ö¨Ó äyœÖ¤NùÖ±ƒ¡ûËB‚ .Câ¤r¤ËÛ·4©3o…ß TÛaüÛspù¡}ãsø#Dõàú 8‰H,©rð±bEè"1;”¯¼´Ì,9ƒP«fl·ƒS2ÂYßÉ Z D(yŸa˜ÖÛ°õSl7 EÌÑA|¼1Œ`5˜xö¹ ]«vÉqöáuXa˜`˺%òUª¬Kò"ôJí FËø”¦CP‡54% 5 б ånß6Nç=FÒ÷å/däv)ÛýóYY †—¥ü툻nÎd:Š Õ1"ý _ÆôË[†q¸Ýbå æÏ ¼hçŽëøCÙ“}î4L\y CÇÓŸûÓj‹æÚ~~C_Ѩ6µ©¼ÅŸÅ`¸±ŸSµe5Ó¥Íji’ÑêÁŽÆoTfn‡õô| Žaˆä‘˜—"F oBuX&á5SóèüôÛÚKÚýdQ_ÒÖׇ! &Uö†sàR»þÙX¢J2¹ˆás -‘”=pÛ-ÆÒëMxÄJä`g' ¥ŽÛ2qB†o Uz/ÿ÷Ž(Åä!Cj%Û£=ý'q?ZσFõC$òvÛ̱¯+h®ž€4D}y"+¶¡¶°²{ÿ aû:O˜ˆÙǨ“\í­õJž‚ i¢@ÛßðÖ]°Ù!=Éë¨bÞl˜H¾«¦†G÷Zžý+qÝ¢^Ypqã:qšªE¡·™Å‰Z„ì Â6à® ˜É dÀËàúаq­ÂG ¥mØ÷ ˜’5|Ür–ƒöüCÒÌ$õ§´/—¶™u “ϼòOIö$bµGߨçRÐÔêel1Cøà:y°yÃ1ìá°Ó4kDÐÌE’ùå ‡ZV]ûQØN¾t¡ŒfS®þºñ³ÉLï¤HûåÓ·˜@d[ð #a—g9‹\è J5ýžÿ ë!38–­Æ6ò7ÏóÇ¢°Ô¦þ1Xê'V}huØn!—|…ëÏ+ð•_¬õú^.ç¬ô®}VPC,<°ÔÎ˹/Úz•r‚ìlíØG…beH–ÕmôEÀ)T.s\ÿƯ#XGÇ™ hTå·O¬–Y³K;¨T6+Â\•DÑð+˜éŸDQ¶16õ¤\«>¡hª˜0ï¸R¼ø á:r.tƒÍŒ]‹ÎEçú’]»q ¶2µwÅR¢bЏJ¨|l D\‡ó"Ì|Z¿¯hµH“Ñ,÷¬‘Z,ö(9Pëý2K¤žþJOÚ¿z@g+ ™ÿ,à_âµ›m6b‡¾®Á_pøhC '£ä†®»wGž=Ië¼{®tÿ»ø›µëޤ͋d¨»GÒ\è¶”D_gÙÕMñöï},žSµX50úRÄYJŽR…ðË vÞ,8r#R<)Rä«‘Wscøûh šÔiOKÐÂÂüßzO ˜~iWEó7g““Ü,” |/ƒŸ‹fP¼Þ\ÞÚ=É!«{ò ¨zek¶‚‘–¥ñP\ØÈ ôÌPí¦Ì}î•ALú´?ôcb9-÷ÜÞíC$öÄñ©ï¾‡ÕÈÄs,öŒOpp VV“"cóaÂTìP妮Q»yuwc5Œ0§RCïØCí^Œå•<àöâþTOr³·µ³ÓÃ6 À¿KÔŠØ!.s±@[Ê a ÌêÛTÉŽ:ESN¶Bvô=OüçVJQñêְ͑ФŸúµÿÚ³¤ïŰnº¼xÑê´ÔƒÞÿÂ=ýþ¾_¦ ÁÑŠ|ÕäÒB“Qâ êâ|3€¶§‘ÙJÄ÷Þ11¬Íäl 7˜ÿö™š•‘ŠÊ±úŠMø¨tª™®Yoc½¸òâØømÁGÛžn6óºmìecƒÐÍLš„‹Xæ©€yºN®ÑM7šâ_‰ (jOýNÐת÷’#$º¢¬ÿ-•0Ü:h‰tKÝÝãu“vB/ÀÇ¿ÙT‘+‡bæ«Èª0+oã;3ÊQ(Ûíä½ cë¢ßæ&†£«;þj—/}¥òwGÌûQÙ›½ŒpgŸ½®»;|ýEÖˆø,ÜÓ]^ŠW2H†"§¾1ßåêÌKo‘îFã‹­k¦î%€vãH¨à¨ÎÜCñ_U„¦ Ší³„@ˆ•ÃÅœvÎôÏXŸB­ Ím²ƒA_4Í¡Ç÷æÆwQL—Ø×-‚ `FI™×¨±)šøgq„ Ä8Ÿ%#Ü> ¤_'Ï…‰ËöDs†¼ñÑ[B.[i»P‘œ§‡D/ð!Ý’S7š•(àqoÔ²1 cc4XiXÇð \•eçŽ Îý,FÈæ‚UÿGûÜK”àO¬@Á0D*YŸâÐÜ%\?ì ~YâªITÓ_MëæÓçÃ_ßãÄ_À¶û7$4Ô‡€*•>ç£N ?•Œ|´™®‚GIŠß†â=ÈØæ|;xˆŒ?R¸ѸÃÂFƒëô[.Gr4 Ò%‘¦’ð:ù‚eFµîîrAo±œ²±G 8dÕtÚ{Õ5H—Ü:ÛþyÏàTœëá{¯Ý…3IÖ6½;1èg~ì×°õG4'­k/µž­œöq(†É½³iØÊ¦»Ny¾6‚+,*åOìÊò 9nà¢sJ7Ú ’‹ÑL‚…i?[‡Ç[Ñû Ã÷?‘@G7ì•§2.âfë%=€D­…2H endstream endobj 514 0 obj << /Length1 1439 /Length2 6774 /Length3 0 /Length 7743 /Filter /FlateDecode >> stream xÚt4ÜmÓ¾ÞE'‰` ¢[‚hÑ{”è=¬ÝŲv…µºè¢EtQ£Gï$ˆ.Ñ»(ÑEKˆˆÞ¿Mžö>ïÿÎ÷=ç·÷Ì\3÷”knÖÇúüò¤ T‰@ñ %ŠZŠúŠB@x_&áà0€¡àп $FPW!ùE(…Ñ)P¤Ðpƒ„î„Ä$…Ha Pâ/ ÒE Bà -€u%áPD:{ºÀììQ˜‹þ:¸ÀÜ! ‰|¿ÝòNP„hPöP'Ì` à(Ï…à’¶G¡œ%ÝÝÝ@N®H;n>€; eЃºB]ÐPàWÑmô¯ÚH8ö0×?,úH[”;È À(à00áŠñqC@ .Ìõ}uM€Ž3ñXóàÏî„„þ÷§÷¯@0ÄogŒtr!žˆ÷>¾Ãö‰â-V¶q’³d¡K7Öc¦HÊ6bYˆ]·>…ϽêÎéxwNÚ7*4Bšµ[Ú*ߤkÒß‘0Ú^ÑC½³é1X=¸y/kÅ)&h5Ê"P.Ñ¢QϹ¤E—,wˆò«¼èbJ_-^,hL+Ô‹®ÏF÷mÜGµ2®Æ¾ û3ÿ ÏT¾·4‡Y3¥‘wñ7kî’ªêKdÙ Á^’&"\Ø}ô 3x‘ˆzùÝœ[Ú¸Rj@{ùjdÀVÎr˜ˆ‘û¸Sü«¨‡iqCäN—þbÁþþ–w;=‘}™0R“÷æög•–å÷#zKÉkMe+Ê„Þu©ÙëƒE/ë2ÀÒ\tYF^s¢ÍÁ²}g¯¤½õ »ƒ'w§¢Í@D¥#EŽÕGQ™Ëm”Á`ÚŠm³ š]Ò é(×ÈÚÞÎýŸÒlf`oIÁ£½~§@t¤T!D>%ÅžJÙ*æÒ‰: ¦Ô‹«‚“Ã675èv´€’ ­cåü^Yƒ-߃¥bBôxP³iÖ¸Ut‹C(UÃw¨ý£[,wQ#§«ßèæëW–Á·{GTR¼ªuK”ŸÉæ¯íeó PXÉ&Þ÷>iî³ÿüƒU”þ’ê•ÀïGð}F”;S¾wl±.­...üTK¤Lt߃]t¶µ|·¢!æ;1•4EÒÛÅÜŸ[ò_«Ṫ%ßo䲩8OÍôº5çì©•ð-#áÀÍ­2É+˜²?Ô>ÆÔ¢ç‹­ßiâÍUãÃ5];}6UÕÝ%\?æ(|÷ѱw¾Ô´ðÏÏ!Ÿ§,gц"”„ Ö‹ oa"òáw„šÆ8¬Õ0‰ŸFªŠïù]¥©î½mêh‘qXzW_&²¢/6EE¥Í e¥CrŽmø€Ä‡"m…»³‰£ëÓ¡ Šž½üaÓ&¹ÆÚÕ„õ®<u”ƒm´ÐV‘`sÈ+TNÙ.ÙÝP"©ôVÚfâÐqŠ>J¹áȼ”©e@ñåÚP˜%›A­¥3ÊÄŠw­ÓñË£¸€ØäÖMÞ¼p׬Ïq󯓆çÕ+´ö^Ò›¼Ó{·YØœÉ#¥G†â¿ß2¶±Y:û²xsôÂêj¢•öqÓ ¶ u]Ïö&Íóq9:ùëZä-TÄðŽ3³}¶¸Þ=ŸO]ÐÓ0våÛQ7¤íû_¯Ó^D}¼ºsË#)@–:ÛÙ]ëÖ”DíçŠÉç_a¡Êà “ÝD(hYY$7Öcð»Sæ¿[%‹Ÿ¶„~Ó>¾M»òP#ƒìq9)¿ðž]‘HÐÆ­y×™Àõ ¯!_ ïíæøi‰TLÄ¢•ÅGØ0Ð4(Ôxˆ]îyGͼ¶µQËÁaÐF3â8Àåœ8hQ6Œ%‰Ò#¬ûGî¹ul¤Ô*P¥ à”qw:Ÿz¦/¶hœŒexÈR‹’»=˜IÈÞ\~#Ï•Ùþ M:Éž,ÿŒ°÷ÃØG»^° ÝMä{ÝÄÀ²ðÚ¶}UÁ’ÎP•ÀÄ¡oo§’ó¨šÄ¡aåÓ`;IiŒþ{FûÜQ™rÎmnr5ᑃ3mËMgÕOû• N¾Ì»w;ŽG>L{?Ge³Ç’ÕݸöšÎyøÊ×ç`Eªu›uè ˆvƒ_i%ýþ ¹‘×ùBóêÍÙçaš"DÔÓïý˜Nž­'çq¥i>Ÿä’ÌsdScxœë^,jŒ6!»Uê>%v[lŠ¡Ä]ðçœÞÎzÉ›l(y£OĪêHYq;ìº-VÊè¦ÏǼSHq£ƒÂdÒ§&È#óÖ‡¶äyù÷LÝ ŒGø¬Å4 I¨rKÞ+®tÀÃÖj£±¼¬µ£ñZwH"+Ìk:ÍÇÅd¢E¹”Õ¹#¨­ûq…rK†Ùehˆ0©»y¢’?øèâ4,FŸËZR±ªq:ê”9ÀrÉiOhÛ¡îûg™K¾;tÑ2.B~ªß ‘©©váè[2Ø»¼úv@ÃÚÉn»y+ò¢¦Høé‹·ó÷]'ÍL5nøŒíz„<ãsPª—bÖt‡çLmݯÁËæ{˜x\Çó)ùSáºÚ Òs2#›å¥Löy÷Óæ¤‘OAz “$‡ŠµõI. †ö%†Ò7—;Ìê `™7Ôr ”¯"xÄKƒZû­l/÷¢ïkÑ®’ð°h–—€ÅRºÞ—û"&«Ùõ™£”c = ³šEÒŽ†²­Þ\Áë ±šÄâÆÃºff‰I1‘?$H,N=LϘ —xÊ">èOy |t¥0ÄwCc ×%Ë.7 .N7º*æ—”)7ãKâpÃäÕH÷ô[œÃÙ­²î(òßT}õ{µŽNá|¤°-Èö™;F•lņz1J€æšTæ-ó½@ þË—ËC‘—³¦†2ó–ž…[eÞ“Ûƒ>YZ@LA2ƒ=XܯÒÒN‘Þ¼b° k} ­ÐoŒiÔºøîLJzd¥Ä¢Ù¬°¢ï-©÷m%±[ò³Ó¶‰¯¬äèm‚} zlˆh?Ý+¼¾Ó“ÙæÓ=ج<$q·êøx¾\¤ÏmI+3J“Í\\R'Û4æÈG&Ø·ù\Š*b¦Ö-Á|‚L0÷H%²$›bÚD#«GdÁ¥Ÿ·ãâÇ‘xÕ»ï‡ 6ÇY™ÕWÅËgÓ¬îˆãiŠg¡lO®xT9ÝñPÖEÆÏ“H²FTèÛjØV˜¢›W_僸ž³…äY[tì6„Ö¨óEÜžÒŸÞŸ2ŒÉëèô1X"j}–Ó縩ßnúÍÁ&€&(SU«µô¤Ë™bœáMíVo¿øC:²+D(ƒ]x+ç[³¥"ÀÉט*ROF?&Ø K×U²%*µ§sÔèD¡¥Üþؘ8/,;óö\Ç_ÐÚÅn‰¼ëÔÂÍSκD®}Zîø"¾(ob©TuõEØ÷YÉxÑÙÖ©|óê{s©¦yû£#Á&ðë×¼mÌT)£î$ϼ2&‡Ç§¢»q qYè™'hŠ‹ð§a,g–™”Cl4XO¢ŽX¹gRnLW– —)»"ãÃTkwè]N³‡ÅeØ­pk…1­•£Ë·,/ØÓÄÞH €Û=ÇNRØ õ/;t'VÔªe’ÕÔÔ&‚0Ö‘YkªÐ Š«ÇÁLéšBÛq‡””:2ÑPv^îÎn«fã,/šÑø&£ ¾!/JÈ`/ø#KŠ¡ö}=³œ—úr"©Cغw›{\½ß/}¾•XyÄ7-ƒÓrÕ!sÏ·n-½ò†’Õº­w²Ž#Enlø®?m¬¶×°Ê¤‘¸ñhú£ºÏ=b‹‚JðÓØƒ€;žŸÉÆf$Jirøýsw-øÆÃäÔ~ ̆ÆhsòÙÙÔHvjãEÊó佤QÐõèaÅ-ÜEe¥7¾È‘ie+6'£êßç9K»KäVEH´½¾EŸÌÔàœ2äÖ¬­à(PÞ&~U÷ü¡v¯RÑH΄]’Ð0qªÌ.Ä Ô€l§"(gd¢%½RDÜ~±ºQaG ­ëêe-u¼ƒ‡u¨¡ Ö[jTQï)4xCªÅØÛµAùrOÙÖT´ç&,RvìŠã V“ÎækOÃ>žɽt ‹[,Ú^µ©}^=0'ûáòy¡á(ÉâÛû>¹^ƒÌU­8=÷÷ITwn¸¶àgAí§ÞV¾u”icS?Mû¬öEàUNöò—'ê'¼AjUvúÃD“¾ÝßB¦{<Ên˜ÆG®âáÓñ–}3G+wyŽ Í(qsÀß“Ñn‰Íc‰x¢¨>Ï»^ŠuývÏò^Ð{¬eaÁ<ÜÒ8ô›îðãt.Å×'ÔØl„º¢oÝû]ãSµÅ£šN•Ö¹œ õéâÞ´0‹Âµ´Kß¼‹úÚM œ ØŽGëö;C)ƒ²êH2í“õXÑ™¤˜°Þ¾"ïx-,Â}ðíC•½½"^…2Ÿödœ8*&ýzŽg³–ý3dÛ©è6 [\¶ëú]©ÓŽ6LôÎS'dÜç…á tRmôiàÂ5›A—ækékÜ×IK¨KÌ„qºpÖÃë;õ âb¶Œv Ùbb¤8ŽeŸF20ޝ‘láÓAÖj——dÁ _žªÓ¾XWÐîWö‡'b)FI'‰a#ÀÞ³Pª^Rªöî®7*|¾þ¥kòOGºfú/åNâW,Ôè~Á W[*ÐL¿|åUЩPŸi#QÉ"º—èr\gQ-#xÞ¨Y<øø<¨úTá’£~L¿dÐðÊ>ÃçåÖ®±%ˆFŽ $îg&¹SØPã©ö„¹˜ª T›0îêÔ¤p¿‘šÈ7»éˆyp‡ —ÛŒ;4‹:>¬ø‹dj‹ÿùaÙý ¦—õ·Ñ¾4éçÜ‘‚GÎÍÃŽ4£y.å?ÂßSIG¾î èYgsÔ,ítX1? cšdVÏ¥ ­ÿ,Zá ý~Q›'÷®¬˜EZ'@×O= ¨†êÅmÝW»(šÙI©~ã?PaãjÍRY@³¸´“CR²  ˜½Xø²û°ê¡ÿ¸Ó“ Þ.—Ko7‚|N 󩃢Ö~iÒƒ@1ó™Iñ€ÒH- ü„#á‡{+%ƒt¶Aóþ,¾-oúnW|snLv×ïÞCÉëY‘çí “˜ê> <+¬Ñ(¯›.–«ÇV`O ±®’÷é‘Ö³LâĽÿ¦uzoŒ­qEå¹9”¢ùmíTC±ù•Á\´¾I?1·ç-ÛÈÒµ)‹äû‰ Çc:þ¡ bb÷ÜäÀ “ÊoÞv;è줂Ëh…®Ý’\V«™—(‚¶Òdl{'}tɻʼnÌ~”ÇØ)Р½uôa¬¯U2×CتL$w6q,ÙGUIƒ~K}ï•“*’OUÌ_Åä C=¿â~Ⱦ ñ®+ /gûÖPÊsAaÔÊÙñn?n.I5èâd6Ýlê2”çÓË =½¤ÿzÏÀ`F‹N'ÞÌIwâv_×€hÂë¾o-óyuQ‰ß¥ÖãkêŒêË­Ñþ¬±±ënž¶ëŒoÝ켑MèÃÖ}YA"”p¯à .gF‰ž!/Ocܱشܦ÷¶™îPÖð¼é‹ïÎ_Ýì+ ÑV9Ï.iMMzÜóÍÛ-¬%¤ÉÛ.–Â,C —ij{æœæ¿&ƒã?“A“Èîp4nÄœüNÀAPβ=Ôr‹Ïzáaíç§£¹—·z>J·rQž~b’9f„/¾Î´ˆŽh]q±ÕZ‹˜Ø“ãnœ ÁѾŠËµýÞ¥±Í'äÍC™Açf›ÅÜ>ÒQÃIí‚êW•Þb#·wä“'¿99Œ O)êêI²šþ ÎÉÜ/÷¹aª3m[Z/:¶nŸ _;Ÿ$Ý÷°>gÃï7ÀOOá|ħ©K:J|¬Ìê6@åšCMÀ |`ú:sƒ¾û‘^ÑQ]Ãk'¯»†.““µ ù]ÿØm>35{³Ä‘L­æ:¦/¼lO¶n¦Ç+¢éæj ¦ðâÜÉαû‘÷>æñîÚÙ)ÒÀÍáèOEW RRg?…àÅ^®ÒǦüE¶_/_+ÇNE÷äÖᘤ!c®öN±LdÛme¡Íªx=‡û29?Eqü‚DËØ¼âO¹'ž¾‰z\BÞ®Ó`¢¹ —"~ˆ‚HqWƒ$¦Ÿ¿Y) Ë'’ëLèx27ª{Tã §úº×"ÁÇŽÞ¢ÐòîÏÝvŒñ–õø–Û7ÇŽT3öÄ êtVÏfnÄ®FrŒ–ï.޽ÆJWwþظ¸Ç.Iµ@CdãÄò¦½… ãýxøö×°"wŠ?RI¦‚¤õSñ»û~pÜg*¨pé¦îú¥ãcßîQw÷wVe°Dûà“9 `î½" ží¯T_]]÷ä¬pXbFý,^Öt K9?IÙrAx^'§¹d”¢ç)òÁà¤Î¨}¹¾pAm>¢5¡å-ê› ¡»‚&ŒŸø‡qÿ«¬ÂÛsIŸª óÀÙTíBV´„3õNø¥oc¸*s#8c']¾ªù;ó³ÕŽ m¿…c#ì4}[%%~ å'â|ß( œqÑÙ[°Krú|4%:'ðB¶1Ѧò/~ ô©bÉKT:òN˜Ò櫤!eW׈,óàüéw rüHó&­Vęדj.°ŽiƒˆÞŒ ‰}d{´f¨4×Sx¸=‘›­„.Ã76"i(îH&®ë@g6ÒxŽŸ†HœQÝñ‹:œ~§‡•“¹öèû¡I2ŒÜÉX.í˜m$‡ëåä.úÝt¯P%·_ÃÝGÄíÏ8Üß;H¶¹(n¯¥ßÊ|êTº7­¸±·XúqHÆu½/¹oܨ4»³©ç’ÅJŸ¤?lcŒÑÍ61áqÒíI2.©Ê*RSâ}|ÒÀö¨÷CkFº²ØÓ—`¿›i©j,‡J7 (gFŸæYïšVîm}&ö0\hnÄ›îïóRªj”V8²òö;…÷†É/$[\¬(–˜¦L–«è¾´VÓˆ ÌÔ>yŸkOЕN/Vè p“Ü*6n( E"ü]ˆuz£·®bðfÇúÎó…÷ºÙ•ý•Æ{ÈjÉ¡­±iÏJÜ]w!Æ×ý_î”csoí÷g0 ïZ¹RHä•_|6«]¥IYׄSƒ‘uÕ«¯_é¿3±çXâï ($±–ÜT ¶#/Á›\nJR ž&cÏ5v?…Û[)3àJë@3dœØ7äNV~ŒsÌ¾ß ®Ðeî¾’^ ¾oÃÖTNUž“ºT„²“æ…•X He¡ ª™ðÆËdÞÝZWµ'dÎ3UKB r+t$®Î1Ò†þˆŠÔw'1óó J\ÖÅòÞd{ž°Î$l®‹kS0@Û¡ò;Ê?¦(J'á’P ™¨~`àªnìÜÇN…Oþ®m¶¹"7¾sÌÞW%o”)ÄsûSó1G¿ñåWÏ5¤ôƒ3ŽW=ÝÕ›‘åºA”ùùp c¾ sçÍð[iÜÝ5ϧTsffÑ¥ÏÐËU #öHð žÓ„Ï€Ã3ƺlbQÖ¼%ê 7ÏW-òIù´¡ñå{‰%wãnUº$kL{ Í0ÎqßìuG™Š·ëÄD UUwNÍèÛºPFb-÷*™&'›1=õ,7 ÎUÈÅ)\rtÜÒp¡Ì*|_á߯æ¸.)§1 õ’MÚHVÛ_2f¾V¥oª+'E5W]„扉ïù…?¼´Ù˜&°àF(*>¼¾™øÙœP¤MqF븒ûÝHjtHtþÍéú‹ÕÚÑbŸ ;½­u²ý\q‹)7ùFŽW‡¦mjåÌ´áw„3?ytpÙ¤*·‡1E®b±uŒxºÜð-VÖ?ËY~v¾ó=ÿ$÷"tËi“ß}… n³eUù•ç)·u…:hÔ K+%(µæ,Î*Ì H°W™Ñ ±1!”x{<Äxr«™ †aÃåU/5…8r>¯ùrRY0³ÛEv—°ZÙ¤±‹&}eÓµÙ•Í4ËÏáI ,ì×sª¯Âº"?> stream xÚwT“ÛÒ6½Š"Ò UzB•Þ{•R% I¤„"½ƒô"UŠ Ò‘*Ò)‚Ò‘"EAéEà‹zν÷Üÿ_ëûVÖz³gæ™Ù3{žÙÉËÅvÏXPÉ îQ‡ÃЂÂB i€Šžž–0‰ @"d\\&P´äo=—‰‚ÂaÒÿPABÀh¬NŒÆõà0€ö€°(@XBZø®4¤þ‘ÒU°7Ô  'Іà (2.8 uqEc÷ù{ àqäKIÝøíPò„ ¡Ž`@Œv…xbwt{ŒáŽPÚï!xd]Ñh„4èãã#öD Á‘.ò¼(Ú`AAÞ'À¯’ú`OÈ_¥ ‘qL\¡¨?c¸3ÚŒ„° ¨#†Âº<€9Aìîc-]€ûÖýüu8a!á…ûËûW (ì·3ØÑî‰Ãü 0€3Ô0P×Bû¢`˜Ó/ ØÇúƒ½ÁP°ð;u0@]ÉÆVøW}(G$F ¡ ¿jþ ƒ=f5˜“ ÜÓC£È~å§ EB±çîü«¹î0¸ÌÿoÉ srþU†ÓÐõzÑRý ƒU‘ý[çAÄA’wE%Å/Ä×Ñøk?ä·Qø—[C ?Ž8cË€B!Ø/2Ø@#@ýÿÓðO‰LXàuD .PÙ¿£cÕç?2¶ÿH¨/À „¥Ÿ0ôëó¯• –aNp˜‡ß¿á¿[ 4W3»g¡ÅÿWÉÿ2*+Ã}þ‚¢"Aq@$& ¸‹]þ3Î=0ô¯<þÃW æ ü ö+_ìAý³÷_$àùkBxÿ ¦ÇRàù7Ó­Aâ GìCøÿÌ÷ß.ÿ?šÿŠò¿2ý¿3RàáñÛÎóðÿØÁžP¿¿Xê>@cÇ@ŽØCÍ!fWâ}àùßV-4;J0,¥…Å„@bôP”:ÔâtŠvtýC›?zÓ_ç…AîÁQÐ_W Ö ú/vÊݱ× ËÍ?&0 ;rèßü%C°CõÏ<Ô`Žp§_Ó'".#‘`?2ló±’8À_;¦Nßßì…`p4Ö€­9à G’ýj´Ô]üKõG’þ% ƒÄ@è¿E,A€°‰âX,ÛW¸ÓoÕ?²r|€DbÓþM'lÊË¿/ÄâHöi î(îVÞvR£Äè#¸6"K¸›ub!"8RbK‚îU·[N1ÎËÑy®þ©GXÝÖ­C_Ùë$azßµžõ¥ŸØ‘ «ú† «CÒÔÕîdªÿ1ûÔfœ'æÊ,ÒeÈ^œ{Ìq”¤ N.½Æ\7îÔuLõá¦)W¿«ѦßÞYSž«KË$eöõ³ºÅaÀdMü€îNÁgÏGa+ñÖ1™úÙudÛOÉR|ª)—úæ¨z˜ßÄ…h{‡®}çŒDS©É 0©ŠW›Í]ÿYPæ½ý˜ÚßAã¦â¶Sï‹EÞŒ“:ý=×Õ½m6ž´Î»®öiÎñÂ_1§ÌTˆ9å,dañz¬Ól~+~S¿|ê1ʬ;ªÙµPù™Ù];*BÇof²{léçL-«Ñ¾p½¹ËŠÕ¯ \¯¼#ñZïÔdP­ªñÓæòn:‡õqzäÍñDLš‹XIf¹¶™È?“ o ¶ ¥ð†fU™^6|é'.µ<òLj]í··+sÏxUÇÁ¨ã1KõsKžœí ß¾tÌ®WÁøx.Tû.Ûèö{ÂK+1mžâß–¦©ãáÒÖüg[±á tB­1앳+=ч,xIN8åú…/ÎBhßõÁÛpDɼËCâ϶1Ûxúdˆ—Âç÷nɘw¸Hôõ’ãɸú!ßši¬-橾0mœjá£ðoç/¢m]¥–¢ZŽ€>XÕK[5P¼á(xs–'‘"”Æp l3åQ|›ÒÒAKAïD-ãä·kmår!$BRϾänˆº02ìçÊ]gµj·c½r¸‚ÛÝú®ÌdV²xÖ:DܸgÎÎúoµ1/§k ¼· ¿¯Ž2Hæ O+áÚuÙkñ‰×U9¡)¨xød6/¹×2ýzÛ·—µÂn÷«Â\ʯu;´·äj?Ø·»&”9<ä}ãc¶ëhÅ rKû^gs×ïÄ…ìf–+½qSD7áÃ@jÄ¥àø–ó”-|>eGÖËè!†1ÛÜ߀í/u0Û%@«ëùð0ÉéæP¡&©aÞÄþìåHãÄE”èè£Gî…¶ñ)¿c†ZHÀäCbvÊD+[7 ©çÎûF΄wùÇf¨&po|5o¨DÀsUÏs_Äà·ûÊ:OkÖŸY±Ú˜¨½q{l4ä?'_]¥Ý<΢œ÷\ÅXÌ¥ ê rò4ÙÌŽçBœÙƒeœÄŠŠMJo|—X9ó¦ápÔyÄ77%ýEl_M¡pÜ.1œXôé•{õ9H¬ 'hµŒèPrG(@Þ8N–‹Þrni”ýî¦ó3q‚Ó½ÙãhËîÀ“Ó†2[jE°'¬pí¶;Xwè!ÃÜi–Éè=aÿ÷!7h`…1‰òÕgüL^·9E~þVXé£;¾ÍÝÙI6h‘'µ2øtéìx§aQ^!äæÌêK“Âð#ŸÇËÒdQ,9–]2àiLë3Ó:Z¿óoÍ×à £Ðë3Ea­ìwƒ÷¼ÐáKÎgÔëci¼5‘’ÆFé~·©esQ/EÜÒ lÛ–ÃZ)¹:¯=2ÍkXò—ŸLVT?Sñ„/®F¸*Ÿ fo;}ñw¥“¥Ž%¶õQ}ú]bxàt½ u²³]RìhP A\ƒŠÊ0Õ…(÷¶(1CÎÏYú¯á±Wê8n®Û‘‘Èÿ|ûÓ>&WÂÇt³ùíЙ_Ið'ÄM"ÎlÓ&ðÓàºàU¡K@âÄ~Ëjkµ;¨Š ¦w6 1_x·R^Pþà4œœàL©â®?¼öv¼ü´áÃGÒZÁE]K³ûϾŠYä[ ƒ »ÑÊ«Mº××±Yôvê&µ7ž<éO6ͬ9ÊYèEyœ™h2 ÀÆ/ýrz ¦}}W?QJs¹±ðQÖ‘V@µMöê:#¦%d^¿Š;!Mラ°bC¤P O¦L wkT“Æù´=Øô#PßcÚYÂ×k©™Ô¬Î'°6TSXÏÇu6ëîžZýÓ²Öîû¾Ñ­j'Ó·¸Îøu¾µ_/ì¶Bk¾ÙF¨v#=Ë)?ë£;8¢ÐŠ37ìœUL9í¬Å7oåL/‡§GM+:ÁËÕöãYeª×óªFÂkÁûlñô,ùÛÚÝdš¼LHã¤fCñ£â‡&tº@ùqwê¯tÇr†>E—wiÅFs0J§O ™ÚÑêÞSHnè¼­¯Rµn¬wôºûbF>ý:UßèqôÚµµ¢|ÓnæÝyª[’qœ{{ùlM걋ƒÃ±Í— ›3º©2vÉœ 3´µ8[3º-x>ÒÑzymÜ<.Ö¶¢K rž¢Ä—Èx!Qÿù¶ðYñD€üÕö3&cBáG a$äûSJ“½‹~<¡+º¸-£èW…¬ø»¦IÔ;_7H;é_x*ŽóÑž'™ÐH%ͪµà•š¸ÎdL½‰¿Q£¹‰X§»Ö$ba'±Æ”\tQÇ'XÂÕÜÌýó„cö…‡ÃLjÓÍt/ÆÅýÌu0Áãû+™ßfÑÄ%nÊN›frU˜O¢3&SÚAmëVuí —Dí/¼ /0d˜é5=3óç9GB_nZ ¢7²³6k*ëD0y~$‡—âD‘ÉK …"ü@dƒ²!K9HxÜšÊSK+V°XƳù]¹îBʽíUK~_†{éòÁù+–*ϸyÅ»¥;ëÓ÷[':©I8 ¤ž“ªVø• ˆ ¡ïUßcȉ,æR•.$=•0Ÿ¿ä8µë˰¯fÑ¥”·#ÛŽ2o5Ó«h<½œªÿ¾ &±g1@ C¼#AÙ©´x<Ùoo¿Úî& $Ç»s¿þQðÕ¥éS.¾3 FëûÊëË©3ɲƒ[k÷â9øn•Á}›>Ýè~hù´ªDûùd~ÓÏIÀkÓÒÞ¡ï¨ ËÖ<·ˆÀ"2ë.´¦Êñîà)K6Luy ðjÔ éY¹–_!û¤š±}kô" KÈ?Ó±&Êã”XÍSF;óP…$‹çS3Ó§ûÍ—N÷JpÙ—œjÏSÔ5Ïwˆ¯V7uü|-’Ö.ÿ⫎¯—hwéÒ[;tseÎfÒû€1ói®hPñ°ÜºZ²bukšÐ®ˆí²¾Tº€‡YS¾²1sox¾~R¦úøcÿô“ð@OóÜMÁ zËJ#”=Ê!0)?þÓE7ªY‘Æ.ÕÄËÌ_Qî¿a¢Öõ"Óc'nÁÕZÃÞ÷Ì"Yò¸‰“gaoÀÖTôfµ×ã—“‡»+û*„ì/®¼;âšÝ.©p² Îæ†”˜'šÖÅ…ÊQÒí6ýŒ2š"U¯ë<:^Ö9ÒP¯^âÜ+=>`ƒÏn ¢…?€ýɲ‘é©sîçÀ5ÿE¢Í±4xÎHáÍðGïúðW¾–JjpQÅ FÚÞn÷5éýžH?ƒ]tq:o3г=OÉo¥Ç~žQŒ`Ëh ZU%à”¹öðÉÞË«}síVœ‹Ê÷¢ä—!ó §ÛÓb™;›Ô6döMQ3µ:ˆþIÞ½¿!¡ò쮆KbKÖé[Fé§ÊrRœ‡Ä?ú·é8søš$’Ï\‘7ÙÂHY!2C׃ÇÍ{…Ê‚Ž5.AjYË#¤8% ŠÂ«¥ ¾ÐšX³ç^×’‡›«_¤URN!¾¸”èãúøÙ,NYçΡD¼–ê4žÉøš´ˆ…RFvt=*Ó/Ú¤\"jwß^êqZò}£åª&×V]j“bƒ˜¤tR´îh…žË™§¯â ("ȾÜêµ"­É$ûâøà¯ÅÔ(Ä} ? û¤a0†ñÅ»ŽÈð€6‹{“…f¯{y61 c[žþÞ¯»õÑ|Ã?;Râ¨f×3¤ÛÉ Ý'sò¶Ä˜¹ÊÊ ÕËOw³é¯Ì«cÀÅW2(੊D½u®åâ™;GŒ¨Îj²‹pf "bÉuvƒjbVDÙä¨ín¦e’ðl«ÊÊÔ»Õô 6-~ÒZ;AÑ05.ž+½t‰ÔH}§oÜëØ'2ù³uI-9¿r÷ƒJ¢­ŠrárÜF Ü<2iÌ>c&×ë’GÄf¾#[˜§³‘ªgþªP6ŽÎ8þAn›µwæ•ý½ ã+V9ù+µÓuÆœîzþý˜b¤5§)§Õt<Ðw !ÚŽ³ýÙÒôI…Waž}!ðìX‰¼2ÕT²¯¿žÄ‡@]c:¥P+=òp/sP„òïË%ÇÃòSbDüF#«iÃ?5²¼ÚÐÙü¨cfÆñB’a9>?¡&Ýî3˜—?F«æHMžZÐ]Ñ-§u¸S¦Ýoÿýmš¯‘ïîBÊf~/©ø˜ÐŒk9I«ª&ýVÁ'ОcCЛZíÒk+‘Í»!¥Ò^´}®~:ó//Õed-¯ ÞGü êØ{Ñ´H:IuóÀˆì¸xÊZ½«Ôã°ÕÖ_üò|Õ£‚Ësz B}IU½§¢/¦cÝ8¿·® ÆñÃ6~œÎ¾µìÎ1_p¢h\x MÎ{u iMÀHD(6îmª *Ë<”±kS’sQ²“þê{JÅç…M÷ýToR qš›pnhé-ûÅá<–¤ê1Ô4upÈÙK0ôâ&£)nŽHº²@‹6ˆdNÓs ZpÉV è¢ùYdä(r4f>ÄHRÞ5F"¸#ë8cÜWß)®4<ÍŠëGweܦᬃœg8TfÉ&¿†Ö’«eFŒNlµ°ð.z½_£TOG“fàËùÖ•¶öÆÍP||j·Þ+w•JyÁŸY=n µ©8L÷Äš|ÙÏö†€œ¯]ü›¦„¯u.>‘0 ‰rSžY‘TˆPÿ²¦Jø*'™É*ñÀO5íS±§ùS;އ8ðUF€/•–ýÒÊn(îC½ÒÎ3A°‹()r¯û)¾þFûy"HD×™=B1û’§ïòÓòÝmÜÕµ;1”= öF·„™àÖϺÏt²@eh&Ö†9¹›#î®yùËö³,û’ËæzGüÔ¥ ¬±lÙÁ8fOT òBñ~xšM-òTè>ÎX1w‰{†{‰‘ÖÞèàV7 T³ùÑ&úd±Ì˜‹‰[¯Ù/¡ØR¥$Ôát¥ùi?©’Ï-b²ãצÊä\Òb5‰Ufsd”,‘Øå‰Þ ƒItvÐ,ïjæsC?2·¥ˆ÷ù%ËißgÖ8êR„¼4! *ØÁ PQáå^1êž1DÞ,­Ôà¿ß9T _»Û±%×LÂÇ=br÷…dÐè$ެñ¥¾ô.IÖ[¬u½¯›]µÏ›ž¾)d*âqK¸rX㣕 @Ç3 8ާ‚¨{AM»5/ß¡dÍZ}p*ú…ÇÓŽŸ°ò±>R§ÛË,ïž­?¥zˆ‹‡ ”ν¨wªÀ§T{˜z>ÈÝMú‘¨¯¬ää¡n‹èå¼à‡•c{•k8¡w½ &KhËdJÉt]ÓÂx ÚÄÜÀ>’iü»˜/§oŠïª‰'Íô…C.’:4v; z¶)øæ©yØ÷á!¨t?‘yÿA¦N}[ÇÏ)Ÿ/ÏP^Q&í®¡È™­=ÝTnisËØž¶ìdÀŠËó’]'ùø˜(<â ÅsÑÖ;ÆúÒ’OŠiï¸l>]$1UXà]4rà;ŸÇ7gmÈÇJP¬ôôñf‘¤½xÖoá#þÈ>´àž]ΡçÒ-h¿h× o^Jeé?|“ÏÒ;„s¸"ÆL6¹zöÖp yäKùFÎHÇË¿ˆˆG»¶mì¶h ‰?xcox¯øx*”×þdzLCÃþÆMžŸÄÇb©âtéõ¶ea á¡4z‹Õðhfq >{…wFêzåKÝÁ—†]V·Î3‹x0üKœvñ>áN%-Éßtz¶©­tÉüš½H_*w6rv+Þ¡”Ød3ß^"I:S»Õاղ+q"p®eò†3*árÄ/çSÔN*®fÚ²~eæèšoCçÁ=»øD½{^º¥‹Ò d““c –„MUº'Ž '‚‹˜L·’£ç›z1ÐÏn§›y¦ÀÔåDÍw&5Ú±¹ëËóµU A^uO²IˆÀ[œ95ä {˜Xo£k Úå;iÔù–>Íߤ(œ?Ÿx´q©B_Eƒ ãI_°Ç ånߘu½ÿ-Nïnx†jiöŒKä"É¥_ÈéVáøæl¬ •W^8ãI ˳bb»ÓWï8Uñ:ö[÷Ðwö"×Ú[b„p5ŠÔvHŒµG͇҇Ÿ3èS(Üÿ<†Œ8ý¼Âöþ­™ök {A˜Å…úx·àÉo!§­åõåÚè#€Ñ³>%ñ+9*—­w*0°$†¯Bdr)Q2Gl3Ê’‹Øw¼cl­¨˜žð¿Ó% xxWÅ¥ùÄ#É(Ûñ3jê¶¹Wà *3“¹OhèÍ|ãâÝmò.[˜ æçQ¸u¼Qšâh(¿,«ÏœÍûŸ0*ïð·3I<œW®é~ʳVŸŠSÊïdŸ·_pãt¹îÎ?äª2â“G[mO\c,n[_—Y“%ÚÒùó­gOû-AC+ZN#Zôw$®yGràI¢‡?Ü“X¾ûE‰ƒÝ””_yÔ­_ëÿöþ5ØwÚP—w1üuR¶¬­5$÷éí%ÉZwï¾R°dGõ´¨g![ë ±ó·ž+[֥࢑ÅÂíñÕc‡ø\ZÞ׳]½¾ PNÊq ì„eoE8k8ÎiC!ÁÕø=Bž*’;éë^OüŒª¿\¼BlÜÈ-ë2QŠû¸XZvø $߃é"r»´ðàß¶®¢ïÀð6Y’Jï­˜!}Ûè™-yc¬owêðëæmàŽ<àCW4#xÒΧ,f˜¡ŠØ4_¶aLc±/p¸[–Ø_ç¶ŠôUB+·L‹rû¾Á1(7ð˜"O[”_7é§…¢]2Õ“§{Š +ý!°åKì¯GšDµ÷®]œjªs´LÿŽ™€c}ßGó.@%ÔG›Mû`º¯JU†‰òdä:î±ÓWýYÅœ;¸ö:Ÿ¤Þ’W‹è‡¾EóÅŒËb®ÛõÅO‘ø}#Ù:Ë«xÚïÕWWrWdçTÉ, Š•Q‘è§Ç1:bôÙè2Ó³àÄØ=ÏFkmB¥Ü„Úò}LØp2(·Ý`¥Ód”‹Ÿ½Tä¿ 'Žð1Å;u­¸—ÕísuøuCµ+¡±+ݶRÅÌÎ]w½Ìÿ2š9:õ5±ж+˜b§Ño0ÆÝ]ÿÁÜÖAíþ 0â’p_í›é€»[^&isÙ8cA×)ŦZ䚯Í(I^3¢2ªPd‘éçv:.J÷ö§£†÷RòéßÙ5{–aH+Ú©Áp²F¸Õ¹goƒÒhôÈ1nqqþmð(îjl»KÀÌ#gïвíEõ[ri®|Ŧ kÀf©«ºs§ûvt*}íC—c½ó 3.ÙÒ«kHÖ£*‰½ðåšRþ–ï¡c:©PûœÔmÑ“DFá”a”jú,Ò‹c¯ ÈÓHW-+0Öxï^õMÓ¯'ˆè\ï;À*úUD•öC¥#œ7ï„qMãüñ•‰½º5?ʶ}só‘2’”X®xîm‘vÏWTó?rÎ9åãÅsUb•âg›š¢gÈ·{m[|Zmþ‡|3Såäé£É‘: ¹ªØrþÓ©¼QõŸÙPI³xúqA§HaÇÄó¹2tŽ[¸Â9&ïªi£h^à`øþÑ%ù§ endstream endobj 518 0 obj << /Length1 1398 /Length2 5888 /Length3 0 /Length 6843 /Filter /FlateDecode >> stream xÚuTÓýû6("LAB¥a”Ò0º¤$¤[’±ml£AºD@º;%¤„$DAB:Dº‘þ3žßó~ï{Îûž³}?÷}Ýõ¹¯ë;NV=C~E(Ú¦ŠFáøABÒÀûÚÚê a ˆ€0€“Ó‰³‡ýmp>„a°H4Jú!îc``Þ¦ ÆáÚhPÃÙ‚Ä¥AÒBB@a!!©¿hŒ4Pì‚„µ€h à¼vtÇ á¾Îß@.7$%%Á÷+¨èà !`PŒCÀð!`{ !‚„áÜÿ•‚KÃ9J ººº €°h \Ž›èŠÄ!€0, ノ Ô;ÀþŒ&à!ØßC´-ÎŒñ{$†ÂâCœQPˆ¯4T×ê:ÂP¿ÁZ¿|À?— €þ“îOôÏDHÔ¯`0‚vp£Ü‘(8Ðiêªj àÜp|@0 ú¶Ç¢ññ`0Òlƒüj TUÔ‚ñþ™ Á qX,Òþ猂?Óà¯Y½vp€¡pXÀÏþ”‘ïî‚–û…vEyþ}²E¢ ¶?Ç€:; £NÎ0uå?¼ ð ÃÅ„$%D$Å0' Ì ‚üYÀÈÝöË úiÆÏàíéˆvÚâÇ€y#maø€'ìâ0Î0oÏÿíø÷ ¡Hhƒ#Q€²ãÍ0Ûßgüþ1H7 ¹ž~  ÐÏÏž,ñ ƒ¢QöîÿÀ­XPMOQÇÈ”÷ÏÈÿq*)¡Ý€žü" ¿°˜$$,”À?xÿ;ù§¡bÕQ¶h|Äï~ñõwÏ.HÀõG!ÜÀ'ÓAã© rýÃt !1!þ ôÿÍ÷_!ÿ7šÿÌòÿdúw¤êloÿËÏõðøÁH{÷?í›x,"Ö ™˜ù™-þÌ*;­jàÛ\?Ò3Hs4~e¶gÁþZkÿ®4v/DiÑžÏÓІávI¯ fü&Y°êìwT<®¡kGõj DY·ŒŽ¼½¤æ icäàx¬ Gë_í + €Æ¦êmý1ð–Çg‹êjà 0•ý“®DÜxQÁé™t_‰Ä¬TÜÕ¸ø8š¹­(/A«ZùØ(iFÚ5’,]è÷¥µ= 'Åu%÷å/ Ë&5 ƒýd¶³ ·®UyôãŸ6÷·÷Fš¯O–l 2:T µ-_ò£®ÏÈë¤ë¡ÍÜ›Ô 7¿Ç"ªBªÕPpgítž<¼xGBüÖ¹½óše®RïI¦GЕn¾l“³x%lÎ_lò¨q© Õ‡_ëYoõ›Öz.±ZÁ½Ê\f@žþn"1”åïb+;²4I—jæ!#Ó] .¥te& Ú<°Ž°…€Ù2š?Ä‹B¬\éI¤Tj°À#•Æëý$ã>å—š 7 4U[¿Ü\ݦRO”iƒÍŒ%ÈæZžz‰¿ZT9uŽçª+è^®Br«4)ŠO†=•_ôñ?Ÿ¤•LfÔ¢æ›]ôªc¿#U˜F ˜ÝÙfˆ™è}ž‹d€ó?ãì÷–ôñfµ|ª/s/Žs¬ÕU{@RØcsË+aÆU:¹•hû;®’¼®‰\•,iX ŒÐRìR’l%ªux1dûä"í%q‘Mê’†ý|á“KYfØfÊ$£eí“7ºQÉk.a+;zËÊ ñêTLù‰ý;„ÆÓã’ß®Q±ðV·z<ŽàìDô,2¶NÙ|¸ÉNóÕèŠs=¼:l4ö`Pxo-W™©übÂ.—;œhøæi÷+»>ú ?ɅŶÕÎSp.—‚wn•CÒe`aßP³èÀJÉ^!M$´ŽS£Í|{º¿Ø1‡§K‘ ‡‘šügã ÝÇwY2³\ Ð=ù¦ïÌ€|…Ç0³Be›¬éý˜µ©€= £~BFǤY œ0GF·¤¾BÌÑŸÇÞÖÅ–LUTÁ}N^4š\aAT|ÕÈìå~ÌüÊ“4¥0í¨l©3ôЗñN©eì‘ Íníï¦]/a& ,Åå^/+“z`[,ï;©®ˆ–Þ_`Dyé²…]søôp¥'µJùú„⻌“žUf²ÝÜÃÔ‚)©Æ±¿‰ü'»oíP•ñ^&!®–Ã`#ÞqÙNOMUyI‘+PNqÅÉúÇa­hNî23µAšÔÙg÷cß­Û]ë£'õ>)ÁÒ§:¬MúñžsÍ£c`ØD%³LuŒˆ%KàÚ:ƒZŽ$nþ‰þDð ‰N³Ø=ó¡^Ç$céUßEƒ× ^q›ºí6ÆŽŠ]ŸÞ÷½æ¥üï9k-ï!ú ›>i²V´@‹ÂÛ’ ¿˜ôUŸ9](Wõ‰„ÄRÓ(o’|@"Δ¿‘ïèùíŠ9KË̼kî7×¾ìLƒË8Õ>×ða<“Pb9^{ÞÔT³s®çé^Å  VWs[í1ÍM£‹MöÝÜØ½|‡¨:ìšÇä`Î @n]êz”(¤Î8¯"u¡ÝɃî:˜L7HkÛÐ1WÎ^V¡¥÷™aó’X ¼BÖ¼eÙØ3ňè¿Ð’Sº(âT:U‡§O™>y“²ŠÈçi0Bê†Ú OEg½K×ÉTÍSÑ$ù<î« .Žá~‘ºuséè©%UcíñƒœÀÝ…1UѵÎú½âï_ˆ® tâ JŽ,j‹ Û]Íðä⃒µ·ópÿ»ƒ7–j]¨@ªöb©pTÖEÍFN_çtà$ß`Ð øÞgëa‚•ýI¹´òÖ ÷ã7r×0—oˆÜ¸eÁaÑA›5ÒÓYyP£±Aä}) ~ÃiîªÂÃw6ésÏÔÑÜ|_+Ôç3„<’||/Zý.Ïô ‰!3ÆÉÁºt‡d#Ìd=Î?ÜpKTXXã-¿¶ìG5ªLº7vÊp©*rPéÙ©™˜èNž«¶Yñ² ┪ůªjvONF)ž÷Ò_çpù!*&|UÓûÍïa\à¢[QV oÏ„âEú\ñØÁxAœ‘ÎGrUvƒöúšB=t+bÅ­ƒ…·ÁHÜv¢ÄDýfýhc_,!B©ï¢«ÍÿÕíß=»eê>Ðd«j?ó…ñ¹žnW˜É»\¢–ZéýñKk¨’"žˆ¬°gÊ%±w õf[0Ûõ^ň®|µSu_? (Â51ÿzkEƒÏôW×÷ùêa|f ´m-‹8Rè JÚ´¥„ÍÆR3áüÃàìDØö€òÉøb¥[.êÓØÊ–£E?h‹ŠkoA€Xc\²òfVÅò¢Ë^ð,ÆæîZtm^q¥MY´‘{¬ç±¨|#—òÜÞ $ëÇø ƒâ*ˆœß­½SR3èa¹Ý20šOûšÆh£ã{n7°}ØñéѨç†ÙD$ÁŠq$‹ŸôÝ)âÔ‚£²ñ;G/òï9 ŒÆìRÚ»^Êóèì ½ÿ*öá„}<¿9Þë[f¿sL«Â^`-iw§mf—Ù,'<@ÞàÑ{ŠÔ ñô+ì‘»ßVùvåòÔFÉ,(Å*Cd¬gÝ),¨¥V¤cŠWÛö¶ 8>öòSö) ïGÆp`V¶O*ç>&%Oímotí g_ra:#¶2µÏ"Æ—òê 9æžß7øòc¼¸K‚µT¿“Ü£Á»qaé÷ ^à<­kè%ˆu“mߤ5ÃzëŒCvè ÕMNŸ êa€úèá¿À ny@‘ŠçÂêØ ±í>—=³{¸ð†râžÃ›Á ¡­ i¸P·½èJ«6F[ëüÂZöºÕ«b&ÛWU=ÑÔ“§BÍ}k--_»=ä .úHÖF´ÉüŒ,`ZzWM<€Y¿wöܵuØDxè†Ù=@5Ì3’6S”Sèqvd S“K…°¾éOèÅ3#|íè’VH^ñ–«.­kk]PêwG“ÁÌ@ëjêàˆ@I Ùï«Öü:Åörg½áù /®,ßOx˜ˆÖÊ×éÓM«ìøx™ó1A@лó8Õœ§3GvcÑ‹V;:4{‹ÀfÛ×yÄHœpúQ=ÈVÅ©ºÛ\ñmÄY„ peMÑÐ2Ø48#ò¸¢d6­°c-6RÌõ˜*þ¾Çû‘RŸ%i§sÕ‰G«<,ÏLÁ/ìjƒòQšê ñ–&Õ°.šÃÌB?vFÖ5‰¼l± ¾ö>‰WKÁä'ÛbV[¬ù„Ó÷ëIK_ic‹aÃ9 ºÚ,Jh¥~±û$Æã×ëÚ3^Õë¡ÈÜßhÖ§’}ÐáÖ¦¿»À¬¼·R§Y(ª÷3qüâ]LaÕ¢Ø0:äw²“‘R]@g —Dº‰Å­37AZ‡hx*ëlÝ?¿TÊÏ ì"Q\]”|!¢hΖ·‹kAøÒÃßM$æÍ÷ºå€C$Qä>”ùÓAâ%ö~¯bv®sñ#¿>¦„bR_ººçùÅ7TÌ¿xùEǾ§6 tk@Ôˆ½1:cèm$i¤9M”ýªU}íÖ-„ëù@Ù3·§ò?ØôÔnꦨx¹{¼ÐìWÊ8M ÒßäHŒ4›õ,ØØë ¾CY<V('®^—uÄ}±ªgw2™±¾Ml¦TÏí¯Ä>Æ8Ñÿ–=zÏêǦô]0ˆlûFÚ’ZR)…þÝ-òég”ÈB(V½6‰nóŠþe›-ã1¥ÜNþ›¸LØ{c#‚°lcþñ^®Ëö ŸoÓg„e¼Õ®~ÄЙ;Ødº<Ü©þfép/#°œy=Î܇Krþɤe¾#âc¤MZ€_Ò)Gb‰NrZâxÅYÒr@zNMÆ_“„LØõ€Ò*»o\¾/i‘Pa T+L,¯ióªN—Uuz6‘~ ‚ì,×›X_·*ÛYU÷-\&,ÚøX9u{Ջ䘌½YtÍað)¶­L|“‰@!ÚÖv3Ã~¿4¦Y];Ó-²=×TLÖÚ¿ È­~)×&{%Äm}Ü„4d³¢Tsµ Œ®¼„´ð*ò®Ë¶‘A·’§ç[‚B=ǯ$£Ú AOÚÉNŒ›wew\r¾m_v?ÙÂ=ÌØðyyUà?3oÒ$çÏjâHî¬ÍIö 6°#Úd°4d–]+Ö$˜„Ù?R}O°¼óе`;åÍë  ñÔ“NïÐp)},ƒì¸…šÊÁóÓUãŽG—ö߃N£i£¤ßN3õêT–—­WŒ$è]5˜Yjçc¥¶ÃiójØ|ahZ—蟅«Â9 l핯ô¿ÞH&n&Hó }ó âMx“ÀõHzÿòRk•Ú^i>çp?³Œ¨þšqÿu ÒÆy*~=‹£ó/íýUØåÑ»ÃÊ2_‡öRÁ•ÎÅ˘a‚üGì쬶MûijßF‹6/OnKÌ?}" Q ô·§|NÇeiG4í”OÙ¾AòS¡UxtI^¶5fhÙ"ªs7ž’à‚“—*=«|öfJ AȸJ(ì/BOrg h ³©5ñžàÊ5ÉŒ®jÞ„áá‰ÙÂÚîµI>Óí…ëeõÍ,¾ôåÞ<¼60å)_¡¯aUì›.ŸK/èÅv=ßPÉŒ›Xõ1,4§Â¸2zß3>o«…¥Š©$@‡*~°ÖKù7}2¡SxœPé8êý‘´Ä5÷”Émh1Œ>mÇ«ÛÜ–›_ÌgòºyÁ$îŠYÄ_ªóo(öhJ/ÂÚöȼÀ=«Ê¢€ð S ^¥»Y(×N6oY~ßqZ¤ßZñâ+"·à׊ ;"]PnÅ)µÜÖlÈÆP“÷Ö’I‹6ÿd‹ÆjŠg¹¥âǼ`×ÌœYß’Ä9ÈeÊñг!¥å­1‘˜«‹¥7  ªÙ “xóõA?öPÅüU¥+øÙ‰§ùD˜vì/Gù¬¼ˆ?ß°?ƒ_¤jƒ_šìœ¨µ×u++<§3¹ Ï•-'æ›2ᡟE/µÊŒªTDõ‰‘3mc* Ÿ&|T²-Hyt(uý³1½‘ ”6ö×븽Ñ~L©nY!Oí$ÁqÄ×¹ÁZñÉöû}nãôgyá˜dùÕôjÓÍDLK~â«dâKô$ߘ¬œÝÝ™P×Ì +˜sX¾ÌIÓ·LÉæ®|þØöó9¯û*Óëº_øµ‘¡t’¸tV5æ<êIç™l vÚ­‹ç „^3Ç}<5ï˲ïÂ¦Ï  m! +*Ú|i#y4Ì´Ü~›RP×y'щË$ðìÙ1 ƒ€”-O÷À„‹·Ô.:5ßÛº%lMá’'Ä¥ŽÇ9E' —ÏúBJW%ej¾ä;™Í C/‚(__‚‘xÕìîŸÈtEÐo­¦«i´õm’j¿z(ЉÊR·½°r‰}2×ò“éêùÀ&md›‚Eè/½dÃÿÃQ <Öê/=ä&|ˆÂ¾kï xpímTëýX²ORcÑòÕ"Ô|°è$“øÜ§kåÚë{‹´/¹:âÍuÖÖŠ›»n]^{¦›Â ¥=ÃTd~@Ý $1Ë™jRÅ)\u›.·8¶Qëk —kÉóÆÎÜË'¥*ESÛÝ#È\®W› Á”Ï{îôb™ê¸ ‡‡.Ž4+ &±›ï6wójóë> stream xÚtT”ïö.‚€ C "0”„twHˆ„0  13C HKJ*¢€t§t#©tç )¥Òñãœóÿ{׺wÍZß|{ïgïwïw?ÏÇÁ¢«Ï+g ·‚(Ãa(^> @AKKM ñ‚$P”#䯛„Â@Bá0‰ÿP@@@(ŒO„Âà´à0€º«#@@ ðPB@TâÿÂEÔ ÅP‡Ã H¸³'jk‡Âó¯W˜ ..úàw:@Î ‚€‚A0€eqœ9ôá`(åù\’v(”³?¿»»;È ÉGØJs?¸CQv€Ç$á±ü  r‚ü™Œ„``EþñëÃmPî €q8BÁ“á ³† ˜ÃújšgìXóààïÝøþ]îoö¯BPØïd wrÁ<¡0[€ ÔÐQÖäCy @0ë_@#ŽÉ¹ Ž + àwç €²œ„ðïxH0êŒBò!¡Ž¿FäÿUsËJ0k¸“†B’üêOŠ€€1×îÉÿg³0¸;Ìë¯a…YÛüÂÚÕ™ßuq…¨)þ…`\$ÿñÙBP ˜¨˜0â€x€íø•7ðt†ü ürc&ðñr†;l0C@| 6̉䠮¯ÿø§E" °†‚Q+ˆ-FòŸê7ÄæY>ê0b¸'þúýûÍC/k8ÌÑó?ðßûå×ÕSÓ4Påù3ñ¿còòp€¯ 8€WPŠŠD1/>ÿ,£ ‚þmøŸ\5˜ “ñ§]Ì=ý«e·¿ àú«nÀ?‹iÃ1´…¸þÃr3 ŒyüsýwÊÿ⿪ü¿Xþß )»::þsýŽÿaÔÑó/ÃZWFZpŒ`ÿ }ù£Z-ˆ5ÔÕé¿£j(F r0[ ›y„ù€ÂüP¤2Ôb­ Eíþpæßð—Ö¡0ˆ. ýõqÁdÿà ì€ù€ 1Äü!1jCý^ã/‚ÑÓ?ûP‚áÖ¿„'(òB @ž$˜Õc,€—F¡ÖßÔðóÁà(L 3³ÀŽ ùµf1¿3f7pë_~’Ô»"˜ÃSsð¿ìß ‡@< `’é 8øQ}EPãI™ƒ;ïÚ$þ^Ò‰± ïPö3"T—ÒˆÅrœ~zÚŒFòt§€ò3ûmy—“Œ…Éï^èJæ*Oá#^få [f«˜‰ë#ì±x¯cFÖ Š:¬¬' òL]Xºw#n¶ËXÛvésPx߫蘊wç¤ÎSUnÔnn-ËKÓ¤e7ÚYyŒª·ê5XùAw/sÅ):p5Ò,,Q;…UC²ù”$νôæRO_ïeçݶu·€µ}ö—(J¥G½ŒŠÂ„¥FsïÈ/2?¸m§PyY©Ü’ݶî*\äN8©Ð>´Cn›³Üwę́¥ë$ÚÉÑT‰{‘’Õ';[ö=Öl¢(¶@í!0Ô"ãåçQJ?`uú2§/X^HC  ÝÕ¢…#fý"½ú¿.oþ ÆywU\ •–Ô@¼¼4äeÚŸvAµSe|µ[)\ç°ý™„ÛÀäÈÊ'F3wbžqd¤N¨F}õÖ ‰5,ð‹(É#¥N­Ul¤û`vk,mÂÑŒúH¶0Z¼€Ý»Š_0+>«Ê¬üNŠ÷Ñù–@P¯ÖÙ'ooü­RWHÒͲhŠ˜EÈ'B³ yߘÐkÈÈ’œë¶²jçéýºr±©’§¯Ðñ‘ÆÕ³žù¡¥8Láo–äŠ6e7:ö¨Š=)îÖh“ÉÈrh™Ô§'§Ó0, ˜ó7’Í”øaõqúªÝ¶Q.å:¦›2*ÎíH°—º®%³Aï yÚoïEþVd+xÜÇEåG Ѝ¸žØI£veÞ ò„ŽlyEªšØiû±s蒥Ƴ¹8D'änLv>ø9¨»«QPFF}îåB×òÚIÐ =­ó°®`‡ÞbÑ[‚ÇÏ×UÔ|“ˆÔ(?LJ”²P=T¾êÆÜtM À)õÓ0£y ‘y7{­°Küjéën¶¾¢ÀyzC•‰På™ÃfEÓg NC ·)úøÖvFÏ•‡Q‹Í¾Ý…ï±[¥¹å è¨=M°—¦Ýë Ô›N­ýè9ÚvyÖ®"ÞV´Î`Ì–ý#Ä,Z&¹§¤8E‹±èà…á}Ó冷QOž› -çóV¢E\ۊǯê½È®X÷’{®•¾8ͪû7›ÞMƒ©¥S·gíõžtÍÇ¡d ›ä(å±5†Ôðûë&twmáxÍ ²°ÎXß'+ðJÉ£C ëdîÔßÜYç;±Æ¹m@Fò¸Í!7 w÷ÊyõÄ)Fy~£‰‚½ ïd!ø½$gdÜ–NZäÁXPéWÜØžB•ªºLÆ·œSãy»:¹ŽDvjøü‚ûq†Õcœ/I/}”D›÷`wÖ±c±ç’™$ôà;=¬X7ãŒâ·Ï\]›8“È%A±t|ã á—>;Ñ5m Qûçéã??-z’Òã+}äRê*¼^pzmxÖ̳œÓÒÆ!âìxEÄVÝmÊ2ÓŠR§ÒÖ5hÜòãZªØÏ`Éæ—]Óêï0×îæåC8àBïXK“¿œw§­„äSP=ÑÍ£’6ÊBÍR–çOƒLV’Y°EnkD ê¨ØëízÀù>ºã¹rLIsðT–KXêë±ù i|O¾XI•z€&lC¸òÚ·¡gêXìœOÊ‚ìÌgÆ'[CíêC¦s& w›Š?a¯µI“ܧ üÖï WßEMå:û§þ&‹›ð4½‘ª9R#;Æ~ÃWºI8aFéæï öüJ×*Öíסsån§–cijË?UKûC¾Jn®ë¸;Ç.§½âÊÑ­û ×Þñwã‰ga·Ë•Yº„w.¬$¨†{enj‰û+„–É£gnMÈ– ·7Æ6\*=*¸A˜Íkç•yâ_×cƒKÓŸG|öÂú#pú*GpiKÚ/pûIB6˾&õž‡±…­gÆ7q1Ÿœ ¾•‘Ì—Ç~¸z\Á”| ;âœ$.™Äµ2TÄÓX›¶él¦+Tkû6K ʉËÀظI…#üPŠ7m\âÛô<«x.|~I "Šyèù` Ûϼ8…ã éè¶+G9Þ,KN)ç1’‚…&DŒf }þÂ~p1†ýî.Ń缒1ˆöñÅBíÎ =e¾lÛ÷lm±»–oÏŽ®^N¼xnõÝž <:.‘àëˆz”/¡– ô§ÛòV Rž±âµôö)îŒY0•çüøåÓýº„Z‘*•»Ë¯”íªy%ý̈»ëÀÂïMüšý3ƒ§lW+*)F Þë…c=†V™f=¨[0ö¨µuo)c|qe,X5.¸ÏÏžL+ÏKAú˜WÏ–öxw¶Ãm—8 Ä5ôÁþ s7.Ñq,àZûÕ¸È 4¬@OUl»úã„!c²©ô'aIð±ìÇÛ‚â8POe’D*3%­A;Á¶Öù·g¾œiMÞºGI5''xÒŒxô#Ïý£àÄŽÈ}Ç-ó^ç?dQ#ëâ%x,x:îÄdJ,{¡4¤ ®ÆV#Jˆû9-uÍg$h7·ËÛ,l°Y«÷—±ˆ’<Ún$gñ@óøWd|¢æå–ùW-\³P–:; b:8Wú­~ñœycOßLÞm›‘­šAúƒ™Éߢ­=>*“Ë'![0@OSº@yê¢ñêŒL¿g“J^u˜B¿tŽç|P_=BõM6Æ¡è:FO{%sýQ†…1Ôäýé±Ý‹1ÙU‰3׃¯ÔC]†¢%øñyTãR~SàµË©‹|¸Ø¨jÒÓEwßœxÐAú"©™ÝFå¡ÁN˜ÖXÜJUÂÈ,)1•s¦9 ÷ñâö¬K( c™dBí‘ʺMo[»U÷ &6,?ÛPqákhpÙnãuÆWo¦6ø®’ï2¯m0‹z°‹¸0ˆE’t—(8ÚM‰fîÃK7ì¦5ós­ˆY㨠|{Ãᵑ¬„P+®ÃÚÚ´ýÃÆ‚N¥uø š&Õ—·vÑ U²¶ííi–2ãÓÇ7¯×ßqd{sˆ/¤^å”W—ã ä¾²OÜ,jgaLX~)œ2e$`yLì‹;oÅX/*ŦnZñT,°òöŠ£¡_˜"F[íªŽ|8W&4D¤IòžÕaê3€SÚz¯±¡.4Ínr2Çc‚x'òÌoÙ¿Ür<ô:qµÉë+ã.h$»à8*†ÄT7©Øœ|+ÑR<_ ²00¸o±Ä®Ï?*-ÎzÄvSmҽȃ¥1^àtS²tw"ßV?ôHíõÎÍ_Ï”à˜s _ &?£YðÒS¨µL¯ô Öë9Ú‡Í;µR™P)39Ÿ JH&Ž¥íÕùãÄl7_y_Ó=tµÈK -RÌ‘,•u~k¼ìp‹S×ó¡hÿêƒRWk5ÃáÉÜçê!)÷F»¬ÂmìÐç_p—Ê©ä†m’‰TýµHãX]˜—¼o¢Q(`áÅíl?éèIì~“ H/°ÇL©Y°Ôñ— á0ö¼Í“OÌöC«<ÃÕv•ªÐëx”R©ïðä"AF´RSÉé#Š€Zâò`íªýœ8ÔH”¹HíŸíÀ=~¡tQûÕï§bãëš!9““üÜBëå]­çþâÖäí ï EÌ5É'm`õêd|Ã[&Gè”×﬽òôn4lãÅÊ|¤Þ ¸ ¡DGŠšÒ•ï ”æS}¥å}öÎ kI¢Æ­W ß­ê¦ì~$È"!õðòNWÆ…1ë[5½¯Ûã Q^Sj¥›_kdóŸÑXò¯Ê¡5ÔÕ²_ôÊÀ}à¸dÉ Dý4ÚÉM/jÖ²vì”®”bÞìbl¿ðÇsy`/ËÁ©hWTüóà~W_~°0o"Ëè¥Kèã³®qxÀ‰ì3©C—h5¯_k_ÕðÓëü+¡îÉæÁèÅsjöWЂ×È|~^FkdÓžnBËÜx\Û|mö çä½gßoåWíLH®f(Qáô!XÛÞÝÍ2ørÖqjZØùAß§réŸMÕß~91"žžXZ)"»³'즶’(Ir.ò¡P9 òî „’©†.‰6M?%•àG"[!ÏVÉ•¡²Ò’“HNæow oR_@‘7|xÅj(AÙ”yZbEã ùÏ._:tϯc/œöëñr+/ªm÷òœä»í6’ﬕ)Ä[rSþhwXWKôÙr鞘Ù*’¡wÍrµa˜ÒÆ›ý(ÏÑ©„U‘S£YÊŸ‰Rág0«ƒÆPÁƒ¯e~ê¿€J¾GŸtb×7²êªóÄ ËžXÅž1áäy÷ô¦æ&pMOÔŒµ6¨txãÉ„×tô·Í¶\ýŽ¯È¥ý$’ÂóÚi48”N‰ ój»a7gUR‹§Õ‡Þ˜¢7ûqÇOÞÞïƒ<ËŽü×Ú,ÓíÄfÞÂ(Þ÷’rôc¸`ï”\£¡þ›6|iÂ8­6`šÛ>Õr%XœU0$r|ù º]JÕe¡Íq–;òMÉú6%ïŽëåÚ“ ¯äÊe¯´$ 5ïø'à“R~%ägùxiÇØÅTæ¨4ðbñÞ´?ÏaGùƒÓ\á‰Dâ€GÊpV’¸È‰@Ð÷ðݧ—ÖÞx°ÂÚÍ¥ç´ï^O"¨øH$—éžg@©K3²aO}DùãØLÆÄëï=„»|OAÌÇû/5ÑÃ*wv×?JT…o›Dç~2Y"¥–žòÕ N{Ps7˜ì>šÌ¹ÚÓñJPÖ·7Ó‰t-BÃ`3‡/NA­¥Èývâ§9Õ=Œ?{þùÀKPºe|sL…À¼3ÙÄrwz(Š”ú\ ïÀ>¿'äË–ïƒá®ü’O+JÜ Ò6 ÷„.û¥'vä°*ëԪ͓Koݸ=¢éürevy—ÛÕÒßðÉ>.$|N2ˆËr!"¾b×~J¶²ªG‚ŸÌñJútÈcD]0È@³zþ°´ <7¹+†SŸÿ¾OúXã¼-³Û´Ó©ùëÃbuzåé¡[ªŸM•å]ÆIá&$O.NÑGQem㸻b>ÍLé7JV¯%kò¯‹qÕÚËTÑ.¨p|óÈ×¹J4¹ótfIÖìý-‰i|®ùúЛô…Ì úJØ?Ó'ƒ€’`Uœì˜+Š5¸Ü¥2(ö¡ï#O’±q»e—Í¥¼9iê7ÑÈ‘äøœ…®&CÞNÓÀÃ}ŸQÈ;c•j.g"¶V»£Îjöô¼-eÿUN¹µoùk@ê] o<È›‘ÁæÀ¹Yã¼ì-x’ɾ‘zBh0[¤»¤XA€Ö7®ND_§½©£üBv5> ý|¹“‚{1ËH÷Ö$Ý)¦³”·QþøKœ– ßÍkõZ2Øâuõõëí6ƒ0ÜŠÒ½§¨#Â?SÌÆh-ëÎÂ`±KŸY¼‚öÂÖÑTQòæ@…݃–zþŒ>/·šÁTÉe¬´ù J6JùÇæu¹U¥êëR_Ò])Ò®b;ùC×»µ[ÜGšb†²Ëã…ÜŠ”Ó«3ý]nGo9 T<«xrzç.Ø=o0º?ŒëÖ‹ -q¦nߦ€.>Ÿ¤w4hÊUñ¢ÇAÅF¬ê¹ž;¹Ç†Ââòá KŸY§jòYóf5o¯±®"öAÈ÷ú¹™VΟ²%°–öÀ/FU%W$\7F¾s/W{œÝsܨ˜¿/ýi<¡BFk›øÝëú†ùÉÚ)q»bà£H¼øæº,Ÿt)ûGFÕc…P¢ûŽRˆË¨lN6J&ÐÓ¤;4@áë\ÈJìsŸ;ŽV¢(û&jµkIz“YÙÑ©*<\Qsx §ë«œ+¬þ$FãV~ ™²feDÜ=ì¸a½„ î§Œ<úÒ9ÍÅÐëÆŽÙDæÆÆV¶{«?îœѧ29ðuæñ÷¤ñµ€j©j½'̓]¹QuûéäjLõ(:=|îÍ(rjE£ øEéT){Qrøè~QTøCÝ·Vá ŠšÝ?î Ï91˜&Èîè¬ß9wŸ£v/Yliz¿WÄØ‡&‰«ªn½µÂCxå†î€º‰‰ˆz¥si5H´¸Â.ïè-|è£üü.&Z|ÀÌÌȺ?õ<µàêVõp>¯$p›ÌË–çÑ&N~ßøÐee«âð/»­Ö‡­5_Ϙ›(®Ñß6Št¼%Óœþôµï »WUzûÛM¿qê:w¬¥4q¾¯òFõfÝ_p"9—ƒÒ±ïRV‡h¿5–/霃–´žI¹‰9UMu1ë°}ÌêËJOTó^ˆ“#LO¹i KiPÓÐÜeÄÖxëñá‘ äÄŠ'ùÂ3:Óž§føõØj¡Ë­›^šL!Å'÷×kwˆØ½‚6ÛßdÞ-‘óe&ß­DjÛÁ´iäU¯³Ž¨Rù¼­ð$R}.®CÙÏâ¦*V™±&Î#»¾à´'á²Ï»<¹zÄÀðé4—-`­Q¯5™OÊ‘ú$ªm};“YíV„côöíCö©–*+rd]F%©5).Ü€jwØ{¡Ê3ÒÑ+ß´§ï°úPì®MëÒùdòÖÿ¬ììí4Ôq)xyóâÓ~o ïlÇûÏ}»{í‹)Ó”Û‘?-¦ñ>jîê?Nbû”õZ2 &(3Œ¬ç‚Ÿðz€+G²)Q•²Df󺈓Ù§PM?û=âépYñ£vËGW~ãÎòDblñoÉe«(QâgÐÁ"CVVÉ– ìK0]¤¬k+¶íMò”|*_i)Úf4þl¹á¢jP³F6ä–Zñ² Od9«bB]ŸÈb[õfxާü2ž3JëtI3&c†ükIq.‹é=Úo·ôÇÓÈÁ‘t3z\–7«~0ø‡-£¶s¬ü§Þ˜ŠiBí†üõÝfêñp.»¿ÉLM½À·Äaß+i}4<ô½HY¿u/LŽaŒùud`3U׎%ùpÿý!*Ÿ‚Ì­g5_ù[Œf»9äx„+rßÊ™®îp+èɦ*êN:Ý2…î÷OÝ¿014ÿ¹:Aì endstream endobj 522 0 obj << /Length1 2807 /Length2 24633 /Length3 0 /Length 26201 /Filter /FlateDecode >> stream xÚŒ¶PœiÐ-Œ»{ Ààîîîîî :¸;BÜ-¸ nÁ-¸» ÁíNv÷[²ßÿWÝ[T súi9Ý}ž÷*2U &1K's ´“£;3+?@BIÀÊÊÁÌÊÊŽDE¥iëþcF¢ÒººÙ:9òÿá á 4sÛ$ÍÜÁ~JNŽy€ÀÆÍÏÆÃÏÊ `geåûG'W~€¤™§­%@‰ ïätC¢’pröqµµ¶q—ùŸ¯Z :ã_á1 «­…™#@ÉÌÝè®hah8YØÝ}þ“‚VÐÆÝÝ™Ÿ…ÅËË‹ÙÌÁÙÉÕZ˜ŽàeënPº]=–€ß ”Í€wÆŒDд±uûÛ®ádåîeæ € [  £8ÂÃÑè hÈ)TœŽ;+þíÀøg66f¶Óýý;‘­ã_ÁfNÎfŽ>¶ŽÖ+[ "­ÈìîíÎ0s´üíhrsÇ›yšÙ‚ÌÌÁ17H‹©ÌÀ þÓž›…«­³»³›-èw‹,¿Ó€§,åh)áäàttwCúÍOÒÖh»Ëß›µwtòrôûXÙ:ZZýnÂÒÙEËÑÖÅ('ù Ø„ôb³º¸XYYyø8@ÐÛ†åwzMgà_‡l¿ÍàüœœVà&€¶V@ð?$?73O ÀÝÕà÷çÁÀÒÖÂ`´¶uDzÉ6­þÆàå»Úz XÁÚc°þþû÷›X^–NŽ Ÿ÷¿öË¢ £¡ª£ÏðwÇÿž‰‹;yü˜8YLì\¬¶ß"ã øoU3Ûhü+çhåàû›-xLÿÃØóÐþs9èÿÍ¥ìV-@û"rCV.V ðÛÿ³Ôÿ ùÿSøï,ÿ7‘ÿoBÒ Ð_Ç´ÿŽÍlA>ÿ8€Eëá¾JNàkàø¿]u€_Z% ¥­‡Ãÿ>•s7_1Gkпc´u“¶õZªÚº[Øü­–¿íZ¿oÈÖ¨êäfûû±`¯æ¯–…=øÑá–ä_G@ðÍùoI)G 'ËßWŒ‹`æêjæƒ^2qüØÀwÑèý—ˆ,ÌŽNî฽€•“+ÒïrsXÄ~›þFÜñÄ`‘xA¼ÉÄ`‘úñ°X¤_€Eæ±Xd_€EîqXä_˜‹Â sQ|A`.J/ÌEù¹¨ü‹xÁ\T_˜‹Ú sQA`./ÌEó¹h½ 0íæ¢ó‚À\t_˜‹Þ¿ˆÌEÿãÌþEœ`.fn`¥ÙºÙ¿ŒLÂÌý%œÛü{1w5³°‚ßTVxqükÿû¶ý{&cñ/bç¶Ëz!Á.`á«ï_Z¿½ÀÏÕŸß²d±ür€gaéNâú‡˜ð%)Øø"l¿k,ÍÜl^Zýãâ¾ñÿf÷–*ÈÌáÌà)Y½@pŒÕó7´ý£ ¿@.ŽßÐó…ÛoÃK=®ßîNöv°þ‚ó¿æKÂÆÇÙèø‡ØöG}Vpçv@ðÂíÿ€àaƒþ€àíüÑ)ø™Íò’™ ê~¼ \ÉÑÃÁü÷£×ú¿GâôœÓé(¶ß#q~9×p¿ïÿ£N¶¬ÿU'¸g°<^vÏ ž3ÈÃíü`‹Ë‹àÀÕ\<œÜ–æ ÿ”àà|9ø_åþçä¿þ|ÿXÿëÌö{ãì‹ <”2\à 7 ƒíÍõÛèùÇÖ¸ÀIÜÀo×»ÏÚ ô§6ÙØÀ¬^Ê‚_[,î6®À?$¤»—Óà@ðª=ÿ€`f^Èíý§÷ù‚‡èûBœÉèúw©ÿ<ú-<\Á;sÿëå ~/üþë§è ´@Z˜u²³ûÖzóYŒÈ‹éǨÐÕ4:&¿×6;4ødºê¬7k®WbɃ]Ë[R´—¢‹¤~MµðïšÕZîýLâÕ'~´ Íãõˆ}í%F|ͤ)ºãÿèâ¯bÝùMžê£‹/šj>öWŒ÷×Þò¥áðÙj;ÕÜ Èå“L1Zц!%ÓTyæÙ3äpîLÄôX§ÞèÓ—WSX¹cϤòñ H‡1E~úëìng|W>i²»u¼¢|¥O@ }‰5/l7äðëc®þg*ëN•Û×§1ç@^XF¡Ï¡ÜÊÏæßROO _ÙpH™f…ÓæeJu¾Ï[¥Qø¬›-g9]¯Äc–,ó!ULØäš?ë§,┓éþ1W5iøÆÇî–¯€ùX»R«%Ž«@lû0Šid¯.d@<ômß•åÞæUE…¸1öíi¥W„øà‡ Mž°¼÷íêÁ¹n*é2bQPÅ×[3݈æGšâžd ±è:šBw[#Å^Œår’T4E J½ û‚ïüŒæ%‹º_}Å{ÙÌþ¥Må†% cåUÖÎ4…IÛ`ƒöÙ¡8‘†æM>…ï:D÷ÜäÈÙ÷‰-J?P¥a gO#@€+:OM6·œq±&DùdÙ¸ªå%V»øº&sº¸v80 #N߯ÁŠ#ZP®¹œ67ïpªpz’dš\Ë5ç>ùZý€Û·cEȺF\q®$«”«Çúi8ÖÓ{ iÖð¦åšë2˜AÎñJè:)[sROyYàç ]'#¾Ì‚ŸY„„¾¸LN ±Ï-Z¤Mx7» ë”vj·œ*%%è~ÿîS#S"þºAÁÁ4pd0ꦟá•Âð5;•u’yµï»kùáWéŒNJŸØ{|W=Ò?¾›æ¦Ïh¡/FííB­˜xæû6Zº&ÒS „gAGð}ìzÃðÔ:×½’Z¤lëÃXϯ{G8ͯ¶ÄVʖʆ™…£‹*W³c¢E:ìÞ¤{¼.dŠ–“U[DNÛlÚ,ÑâB¢5¿îŽÈX:õòœ|o)nǯûƒ©z*¿M âzm¬n°9•w¯ªLEäl¾£{ìå‰;KÃáó×±¡!̧X"” øp_¿éX\K£–†(:riœ{Q—1L}®Î‘ñ½)åûI 4@“°M;üØ*÷`£|W;ë·­‚@KcƒVô´˜qÀ…µ­+î  W:üéÐ#Ú 3^IPXé°lNźKgšqß“—¸–ÈbuÙ j£R•bÏã'Ñ£ÓWdÙ,Ç;æÂ.—È+X»Î Tù}ï@¦¥hž×…u”†K Gˆ‚HƒãõSŸwJÀììÑħÝ6Ñ9…2{ RðwRB6ÁžJÕÁ\{z߆곭´÷Ì\ñ±Æ¸íÚÌ=‡AT…í %BúŒ4©žÃ‡„"}Ë]Iin\¦WÿqÅÚáÓs³ïX´t"¨ü¶‚¼K^¸ 3¯-«#þ:`W›.fYc`ÉöcÞIÈjɉ:^#^Q[‹tL?ty›j6ó^›"ÌD°÷ L1‰Á¨®v&~ÿÅ/µÕ¨šªÏ—ž¡o‘€CŒ ÎO‹„¡®A6‰w‰xgqaѦ ?B„k Úõlœ‰¨>7¡ìšª™ç„ï+­\“Ϲ#8}úl$ôåÛý1XÕ±J ýæÎÁá~+åÈ!•jx{ÚÚóy­#Sh¨XU*Ì*9ë¶Œ­¼¼³$¡‡Ýáo­s… …ÖEÉ¥×ï¤o4óÌïÓâÛµC>€hAÖUÙ‹æ“•1+d{å3)3ß 7oÍ8ÕØð?*ø6]´‹K†‹ nÆöGùn–2Ñ|ã;à+ v ùg_+æø¾2ú€yZîŠY”_ê©,Ù¥$ÃÃG)§hûD(6oM´áâö|'+­Rw.¨€øã@u¤P僘ÁgxbÐê$(Ÿz·îFïÇ\-ÍÂ(„ÎâøPêŽ|ÖÀÓ+Ü [DÛ…IDóÂ. $Þþ_1Ù¢™\H$æsƒÞM›+îlb•åÙ(ÎbcÌœóìæ^I ÷²Âce !ÍkÉá/+Ƚäéd$Û <Ά…^Þ¯°ô6eŒW¸¤ªF–÷q±^çš,7¥ÈÔ]oœîÓ’ˆ¡€°'ŽÙL—y=˜/<Ž·Èï.„Nƒ|k'¨œZª×>zC°¦¹½Áœx…¥Ã&í=v<½—º°~rˆ©óÖö¹¬[ÄœÈ&7¢ð $H-qö<ïDÍ&O¿šï-evç{O‰ëب'Q)Áv×ã^n)Jq]Ê 1n¯ün:Já3äÇ)‚ŽŸÓ‰ é;Z8äùhå‹ÈbHõ"˧O]÷G •kô­‘‚}ÅyÉ[½ØaØåÐnÅ|‚u2±¨R¦oµ÷ómÖÛ{¨pÕG¥‹œTÛz6'0Cƒ(ËãÚÈ'88Z¯UùæøõcÜøÞAÒ˜nU’ º.êÜò+'¸M]ö'5ŠÂY…¢d물¥fçôÂ*ù"ïPN³ëœ`ñZyÛw¨Âgþ\ðƒ\¥8{hD§›^Ëh…¥ØÔ§Ó|µËñg Þ‘©buÂ’Y¡VdS¯ßC–çæ‰âÚróN>gâ/¶4Ê lW±çc·dœ®¾‹sGý5húô¡²ë!·ËS§LsQ¿xŸYd2 Ò(?| f ýúÃ’V|Gäusç·Önªi–”L†WÕ£Ó™ÔŠ‚Îß`°ÑAØ(þM™µ¼{w̃=)õ V£ý¾>¥ž¡¤&_Ä}«†Þå†ÿbñœnE€ƒúyÑz9÷®[Ò¬€Œ÷ÕL¡RÊÒ;k¯2x$„žÒˆz¢>Fgos¡Ò+oANâ³ûŸIS²=ÉXo÷"¥“Þ ¬¬Ý—I­™D¼±ºQõæ –}û×ÿ'¼ÎC­À’ É,†69‡ø/®…‹‡› YCò© ¸¶”Ñô# .å¾rgavùñÇ‹:7èãÈzkÚ_eÞ¸jŒhîÂU›¼#‰2n½!ü¤ê”|FÜ8Ôw>Ut¶u¯"=÷íº®tJ£{ÔʼnÕÅÍ@ß¼¿š|œÓËæÿÂ¥TR ³¶s¼„s ý¡¥½Ž(¨ôžÅ®ðízïBYÀªiÒñ$µÎëàòíY5Ý&J8Ùµ’]ôaw¹ÂÊVÄ æ½×g¢óޏ®)&¿—CºPÛU¶ÜÅ”a™QS¢RE`MVñŒMÞ.Yã$ÔæàõŠĘ’|?*U·zÊ ì©ï\&­ŽoDNÚ}SsŽ'¬Èš¢ë¯Ï¾­+:g‰€×xEƒbÜtÉ¿í#_c'úÇ»âk¨-«ÌÀh3î’š Ô‡²þ${Mš¦Ó Á8"Çùmw¢[¢n€k„0É%~®Çe²(Dd;jÜ—MBƒ¡ãu*[w pJƒ}™£B>Eiq(,D{6UG‰@Ò TûÁâà¬Ì¥À©óŒô§ë^š_5‹”M©\×ošªæôˆÑ øÖÛ³Ûý«G 0Aö=E/ùð'Ä-Ù4¤´ÞÒ©ÜW T{ERÕ‡$÷™Bâ ÃrFDÁpl׊‹©fL´aµpE›r=¦o5\Ÿ|̸Jªz2e3ã$|01¯`Ê&ðõ ð¢ÞŠr'¬¬MÐ"ÝdÅ #gw‡6 JÊÚ½ËÇØrÃuÅ}㽜‚´ÃÜ%¼8>[]7fŸZµê N©¦Ü]Ìø|Œ£³šØ–öÍ4mèoÉß’³€Õ¥N|†mM8†z:Bðb‡dK¿ym¸¥]SÎÑ{aV)FæãÓºÅ6Å€“cAVà} ›òÆ|Léiöý‹UÇZJæÁ÷âþ-r™²ÌÊ]+%· øiR]­Ç€‡«º†F½žºcäàé9*»‘~2Ùö“(Ùg„Á‘¤&·õQ{フžÅoÊ7zæ¡} 1Z¦@¢\€/G_¢‘° áJ Ó x$n9úþ¹óL4±’ 1ÃìSm0NºXEdø>ÈI²V‰ö<΢¡„bÉtnÜQÏÏnÉ”ÃåI\eÚL#úø´^Cö£ö!ïrJµkèÐ/)Nª:íDhÔÙlÏ9dÞæ@ÅÚ4»á8sËù楒×Ãg™ÒõÚ7ª3d^>zÒ÷;0cÑŒhluI¶ /€|H xñòQô.g%¾Vö:ì××WËxp™ÈdÂßÔ-°ߣ»³DO#?­Ç ož"­s¾¯a«tŒ0¹—p†cر*·æ³¡$¾+í…4=Qº57žl’Q¸઀+ôê?hÙ–su9+å°{³¦‡iëñ)¸ke»û¼mâäpKÏcŸXòòŠ?6fÑ’^½z(掉rÀTLjC·ÙlV^8Øl³9Æg0]âñŒ ±KÀ§ð* ³GS¡ÌL—rÛËz0±^%Ô`Ê;ŠÈ¥?´ÀFŽ6å¹ÕƒK±¤\®Ã¢.À߆¤ƒ2ÞWr[k¬+ΫE/†¡íñ“>ÿèÉnÏXaoÛ·ó:Pаƒ¨ÒÔãFŠÐæÓ!)îìrÄ^mFŸñ"7Ñ1KŽÏĽ©ÙiVñj¤Aõh$†édû°TNA—a'ì¡ JžïŽí¹¢Y>V€ÝÐçÝAÑû‚ȽAÞè;':õ°ðé?ß¹}Hcu¤GóC«‰è—ù^D%aE 7îò‘:3)NPÜCŸ(˜ LkK©ºLSòW¾ º•‹4{~oé36|xOŸ€;û¨6´Qªlnõ–a©µ}5,lj1f¡D ±ÕwâÂú§õˆÙö‡8Zéé‚ÝØºw>+åŸÆ¡îè[¡¬¯ž9EtÙºâ8Ke3Fò3çÎ3Œ;Ç]N_²Ò´Ž.Q®‹Æy„éú /Òeãr šK+ÅxÈ÷ý$ÃÕYØÝ•zûݺý(¾·ç“Óý•`UP–5½ù<öxÏ€½P¬+uX’‚1Àüsƒ¬c¼›œ^~Iƒ­cQ¤áõì‰Ý*1õ䂨ž< CÅNÄ·¦¬E,¡Ë弔ܞ_45õ0ßS,T)¦>sŽ–ïŠdBŒÑ\^wßIã[jË(Î22ìâ¹á~’y*\7fi,s©í†¼‚´‰îEÿt{«OòÉ7L²Ì]…㈕‘™»§4/*lG'¨ccº­Ô!ü<—?ø¸\?Ò–”ŸñOmnÖE˜(‘pÀïÓØC¶"x„J+HHR €$ŸjU¸š¢×üØ€&}}g¸Køxm<ML,ŽØáÿS iØóUÖcšûY­÷q<&[cÀ\À›¢ñ)Ç©Æ0¹9æÑU£»|<<‹ðPžÊóq±«öjH×+o£ÏMp­Ât›'¹uFÁ ì[h.§v ƒÝ¼qi FeêRlÛ²HÃeµN¹sÙé‘_ã¤"šüG¢óÒ'ø»ÊÏÈðº+¬5‚ŸèZlÖufáBÚ8­š¤%lb—˜ç¿jBÑkÀN0‘¼uô xdDŽÐWn”—€üU}¬‡£ ¬óíš¾:åh4DªŸw?zzÒÛà2Å—4ÉôîŒ …ÖÊñ¢ÑM¨ë&#Š®5‹Á-‡lHš¶»|%üÀ?¨mr5(üTÐO±ØïgYìì5F a{gû“Ô Ï5qDËÏÑ÷{·†Ñ…ªÉÖ^Èû:M@«š¦³Z‘²ºAI䵊Sᣎ w9³eßF%¡(Ùî\Ꞙ1aþ®rÕ²Dƒ•ûòðìÛØ †FNTƒFì<êŠý¨¬8…ù+i Ì-²”À‡r’tåÔIéVÜŽ_Û–N7·6½’ó> ²jŽ›?†ƒ·‡Ñl ð$¨Që{s!lsýŸž.€ûµîk¡ï)8™¢(ª"6Hª#6ËgÅcL޳ä[C$öˆS¢)_ËÚäŸ×Í O\¡O-vÃ¥Ein‰Ú52™‚Ô¢Uyu¾Éõ{F7¤Aé¥nk«+fOý|Œ]Õ·+¡䃙øI”­ßòô‹rA§ŽÚ “öMCˆht|ëš|Ã¥O»¨B¾#ã·ìÔ˾Ӆáæ\Ôë«Û˜²‘íqqçS·áƒ&c> ”÷¨ÉšcÙ߆Sêp =Òfç0q&Ì6Ø{ˆ4´  ú½ÂR&J0P3âècú²s–Y\_õ+rRž±/I×ÀUx Λn–®óС}ª0é^@aýˆ#7~q2¯Ú²jJ«^áj?Y7Ü;r?ÔBj¥^&Š-xÂÙü¡ùŒ;«µå)µÃg±Ïã½vþe{²ë“€±†R+ÓÓl‹në©Ü¥ž]v<½«¶q´»£PNQîµ=rA _uBн½:ºøþŠÇò{f“ôD±Óõ…7­AÃÓÑVám(¢sª}•æJ¢¥â;!vØ µ²Sca«ì²x±p&³»—Ò»ôšª×Ÿ[Ï©oÌ—<¾SâéSáŸÓÁNB^Îf|師ˆ&½%$óðt‚´uy0âôؽí»c/’Â$I 3;Ùw Hršï®¨[߇ U&@P˜Ûn]¸øa‰xøH*P²× ;fãJ„«Ã•QÝbÇ„1ÅÕ`Ûߨö·OX½ÃG¸¬“ ¾¶Ñ` eày±ø˜óö]*`Ô—ófÁQZ¸ü©£æ6Ð}V¼r˜l׎騛« ¨yZ› ¢aŒkeÎþFv≩A*‰…ñö\³M¿&Lt×'P(ï³g Ì²5\##Phh³±åá¤f½5´þÉPµ»¶I¸,ö~CN¤ÓzØ&{$Úrb*ÿm•²a\ÌùXIØÁ«déÎ’2næ+˜bR¿€¯Ñr„QšŒ<æ= ئýÝ—º=aKæ§¢%÷N »^8/">…À‘à'þÇ”Oª¸N²]¶E7„ÃÙ2nr”ç„áŒBåzgÂ…&àvÿuwâè$¶$ÿaC6H†¹¼|¥kV'ø«Z»öYMŠxŠÈ×Ö¤^ûê­òaÂz?”•¹¶ðÉD¼–5'}9tÒ·-X2MØí}Ðè°®I)’£K7÷GºT@ËL [9ÙëoËO2¡—K¯IÈ7(5«½l*áe¼ðz´PtCšZÌÔÇ)ä¸ c̰,ÖÜŠvØw‰žö4GCç?™š;¡Û »£¢<ÐEÓjëbTYVNý¼å=½“¡-–êZž)°?;F¹xÔþ>ãvzB*ƒŸ73˜OÑî&Ž IóúéHªÃȯEÊj$RU+27ê¢p'ÆQ¬¼yt<…íi·¸œà‰Yß®.<³¯§nu¥9Œ| ^¸ÉÞ n‹ö]ù±ú ÎR&Ž´XQMÁqºŸ< ÛêýsöSÛéÝ9Á8¼&¬§´©æN…%`–ú ®-’·0ÉQ±U½?;äÅ[…Yty¬T×K¢ìgÖz„¹õ/ ï8wW Ý¢¿~ÙµeàzÞK-A>í?e[§/„Ü ùcØùÔÕ‡*KF«rýO²áŽ5°.þÁsÊí}káŠN循(ñ ‹|» swþ¨?iiŠipQâ*+ï´Ðq–´QÿëPþÞ2½(—68Jq,žX4.Y ü;¶Z(Jµ],o3ªÝ59¸¯Á£ ¸Â1Y{‘t¢Åˆd¿p åò%Šß£ìé >íèzUõÛ8ºòU­£n=HP&†ao¼#¦”3r#œ°‰2~ªÕÞš+zV£üŒ$@³”13o SíŠ%7Íàïƒ^È‹ 8Ì‘8í µaqÔ ¿´CÈáƒÄVsUB} P1áÖ߆m»-Og«úŽ§È¥¼BJ¹ƒå;Nu.ÿ£ V ÿÑT;+=LG÷]ÊišLêû ³ÑùÌmº¨†¶82«Gƒ´Í"Š©›_ܯ `ÍN=ú ›büJ,è[è9Ž1Ø-KÎŒy @ë|q÷«¶8ÄIÑ_n¹þ-¶1ÿjqŸ¢ºï7ÂG#ƒJœñ2’32ö7À‡ þËì’%Æõö¥¢´RƒŠÓêRzGñ…Ù Y_-Z—ŠÁ*nO›ÚIÉ¿f6-ZpçS ±E‘¯a¬-õSIÌÚàÄý"Ä`*®}Ö@+¦•c—t²X陳”ù!õÇÇ€¢Z»¬²b¡¿4è=ë"~ ŸÄçíR™š $=µ5:?µÝSwÙ;ÄŒCY‹ŠÑp9îÅAd»¼«QxÊV£ GSŸ·{â5 B‰"ÂÔ^/ ¥àب÷(Ù…?øX[ ¿¼åâã;úr—SÁ—r5ç†xåŸ÷ä9ÇÝ7Ï“jú>% 'MåãºÂžéDêéSÊ0K5ß{/ÐS;o«W\ü|`%jÚgiœ®†ï ·„Çuõ™µ®™¯H‘óZHDrÚˆý°îË Òá+é J¤˜ÎŸ?÷¢A&Jè„*D{,Ö± cRÎH>*d^òä‹÷®?Â}Ë„ ™h (Û»ö t³J@K=n"¼^*e,»M2oÍhóÖæÃÙSÂh;KYKªEøHGƒµýþ•[ƒãµÒùÛ›^;Œœœ€©¼K‹uƒWHuéô‚P•Âo2œŸ¿ýt!ö@÷$M‡/ä5‚9*Á€?Ý™[7¹ÕÓ§q#8påµen’ò{û±£†Ñùùˆ.ãš@°»ÒðsRÏ %÷špG'®ÑLÕõþ4²ñ ÀŸ«¶DjÓŒ®OÎvǘ¡du¿¸†_XcâS*åxs¦%£.Êô€Õ-ë«ÐßÇ™ƒ¥?2ô–j91u†Bø@Ù§•‡VPhìöÎ!~5&<¨\C,´µz~IGÛÍM \n/g*n\=äªfƲ–×øZ¹ó æ'3¿—•ÊH‡“Ÿ»ö¼³ÂÎã2“AF) б6V번/VµkhH»d'öuÉÞ÷;û£ oݵ;¢XpˆÀä¦ïø·ù¤Tl“r^Á™²R“ckïÂùqüñ­wößa˜æ†6¢I2ûE0p¾¼^“µ œœÂl,œAïŸä{Ïhú=ï™÷p%±äñ¸¦»sF‰8˧ʘB ‡õÔÑnó?ø§ÿ𡬖/ž¾;êÔ.¤¼ñdø¬ö󹻸 ùΉ{-gg±èUZ»^GÀxRkЦެ³ÐTUV»zuí®©:|x)æPŒ!·ãÕ“<ñ+{iúurñ#õÖ$œÃ)Ôçä(>QæD¿üˆëËUï–ý»ªw—Ř5SÞõºßŒ©®LHH÷Ãs±Ûu‡_!mó¸{2Sh r›[­Í»„ vÀ&Ïö޼£u³C Z$*™B¦<ç••Ktˆ½ÓYC‚üsb=ˆà?ܦ¢Øç2­¹ïâ;qº sN‹áp07¡ÙÖ»CõöB :0Hý–£¡“H³9Àny±Ð¯ÉöK« âb}Øèœ‚©ÛòL>nmI Ì…¥EïÁïà:‘µÚ(dˆß´=Bíð{3œrÌ*§®z¤Z$çPYÐlŠɆî LOAê"Lé…åÙ|hfŸâäé Ô!£èÇõHyޝJ….b[dçmFv ªÂFµõqmÁÜ¿@œ²‰{ÝÉ2ž&(pé}ãJIÄ#,ÓœRã¤mõY›Ç˺Ó5»=®½Õ¯ïäÙãø2…þM-†òõAx|oCâ—R^fÊ ä@:’ãÝ-Á‚MVÒCu·„1w29I ;?Ý]ÉÁ/ÞðrJS™!:ë™"«GÚ¹„ã·Ÿ¯…Óg)gó áXÞõÓvYêóC…Œ¼!™AžnV¸~ýtNR—Êa¬¡z¨µÐ WÁCèT×cý¸ÜA“Ü¿[NißÓ²DQøŽÿ×½RIÆ!±b9õÓ Užµ,÷l`[»PÛWì’ qá5½eUSEoÄC)L´ÂAÍËî™5oÝ ðå!ÐŽY²æ¥Ä5 å}Ô5pâñ2cbD  W«<8à׿@èÈ´…Æù¯©,Úçëÿú ”Lî|{ZtÅAß––k•‚«´_3”~%&‹‹š,cHyGîIg>ïvx;M|ómÛ‰üÒàÛN7»ut“¡ˆhV0kO-u®o( 4$öªƒ®¸v¶6¶ëІ   aâô÷µ¶ü„x£wÈÇ„ ÉæÂ‰Ñox¢?Hg*UÖ…Ý‹:òãê*¼-DIIpˆ‚Re†]ÎzÅ8à:ä§\?ì„#éAXÉ áÇ‹Ö؇wƯ%!NÎÚ–#¡ãeʘFßÈm tò²Ña#zºì4 é«fýÊIG¸,Ó"Ô×ô×™Se6‰yüD¥xš›$¼h˘Ñ‚ç÷eÑZžÊHu¤O„,jåM®ùhr¨ÿJî /$>ŸÿfZ+ã‘ä]µGˆþ>•zDÁ±U§¹7÷¼àÍ[_•\{âûè¯9‚ðmÙY,ôwrCÙük<Å73›DU}Øïžß ñá=—`è!žO¶øaH™u´1vµÜ,J2Ž~úØ$8ŸŠëèšf¨œºò-·n܈Ù`j<Íf">×m!?õ °YƆ¢Ïƒ§ÆìÈ«éþæ€BŠìfC¹uŸ«æ[j»{[zì)%âúáýj}w†§iˆÕ£ëæÜ˜,³ëŽ›Íò›SâÄ ÛXŒÎÏxêqÌüú6¬>ÆPiŸ¼É©8hÇŸ2»‡« '°ë¿+ïöS°a$Û#‚4LüP4־ʸóXÒËãø;¹fö’am80AœÊXN.©LZ‹^îx\“Z³Ð~â°¶§ÙqE0.Ôf5ëp =QÜw\ŠkÂE ~þzÞiŠ˜¾¼XÑMòƒ²ý¦Œ×¶`u¹Œì¾Sâ︌ÝÏoV»¯I…"ÚÁ» .&ëŠ3ÍÈáÒj–ËN^Ó5ü­¯Ð7åªòŠšÁåXÅ m¼GÜÊZ.z± 3Ad¥–˜5;×lÄEVž бÛHÁW¢ÎAmptœÈ\<%‰œ%°®,BÂÕöS™vÙeGZ„[býþÅYÒü=kMmªîµøqŽU OücÂ¥zëuM‚JjI”‘nèík£ÓMÖ3Ù¥ÌN=Mî4>ÈÐêÒ"10V?g¾õ«¯‹×q|t·€±ô¬<ÂE0Àù õ`?3ÊhP£y‘zëÉr& Kqõ̼‚žëÕøíI™þTÓ|ynÇI§öuMÑ:]T‡m·™ {)vÏLІJ(©¢ì{lÙåõ 8M®2ÆFrBÓ,óåúxôIo"‡Û ʶ-5-=>yR÷"‡z<¿s³m±gNaƒUádÁ¾3 ’M90Ý?ÆàQÊùP~m@¦Øæï­Ç&Cï¦ÕK&À4D«‘›£„Bø1SCe°Rí݆¤ï¹„ÛkÈ2ÌUì8„ïúZ¿Žâ1×4¤B±ÌrzDî¤#֚ߢ š\Åœ˜ J‰odò'äÚ¤:~þÈŽ*sížF™Ùª8¦>´ZEUx‚J6¾öÃŽDç‹;7º9yOò» 5¤m8™úPóÝh¬ä®¦žhìäuÔoǾ•¬öêÏÎÎeõ7–º.éXÊKuˆ²xR÷Æ‹2•‰†[m†Þ7)0—£]3Z8h†ù¶?ÿÊÕšÖ6 Fý‰3$¥å¥7kLõÆÏ_@ƒ‡–çr¹TÉ&ááZ¤09b)ÁÇï!_8!BzæAr¿‹ðaé\[--r|XuólÇÇ(=ÕdÍ’£%]™ìƧh;Ú^_^d0D¡>¿|kïïß9F¡œUã„C(yC6pGYœ™1§Ðûôì©=¬ø£)¨ -§£s½ Ê3¿|ùàW†411 W±Ì:–JÕ_MÜaó˜Àà'7ÊZ«k(Ÿ9 5uéG†¿âHÌ‘}U‘ߎ"<"iHsõP1…õ f@À(¼<œT!hÇ-‹Ç¬ÌžWMéSŠ€!W¶ú¥~òEW<}ÈœÕj¥#‘˜(àbªGËdÕ^šÎŽºíøFª™k#üø´óø›ùÅÊe!ÈJ A»Ö^eßLŸtò‘íÖæéõâðŸý˜ûj6nС;)‰”Šñ¬ùJXÖ:C1#ƒ ž müùWÎXÌó‘MsB¸°£DWu÷öL ãÀCE-,q¨o8µR]I7+:’…‚CI<ä¡B)ˆ×ñ™|– åFx‡o\Æ¡M¸8,Ü;BÞØ±:?~fš…"ýraÝp\âèÕø”D"ª*„rµr5h*røžœt4ò¼q²a§}L{û"çj¨gjs ½ÖºGF¿ Š~ÒÜü»/kd¿¼ãq­I‹ ;@ôËÚIÅ`xÜb%lo.2©d¹·ŠTÎÇ-¶€´ ÿ•m$L¥sɯŸŒ6v )r¿þüdYkwOÈ‹WÝ¡§Â%αÜqAâFÞbq0a‡¢G.ðõMXí‰àðüÉ1ÛkcRwMtDSo~€uýtÿ-Û<£µ‡Æ¯«ÝÄõ”ÒÞ£Ç>²×t$8©hE}ØÝzÇa’mÅâá=ª†¸æršÇ¾“wÁ¦u3§4:çl±vÜ…'ILàs >‹2‘£9ßÇÞ ¡‡hÿ˜@‚¼_ !çáPÞ ûZ´P)ƒXs}Ĉ‡¿24UÑ ä’9åõt˜ÀvOÌà‘÷L Il b§¬#ðkû+S¤œ¹H¦Guð#aÞŒµ“ùaLY¬B@È<-[¨Žpgq5®NϹÒÔ‘︡= ¾ð訮QëzK„Bj¼e^Ö{ Iž.wëpŒ4ì¤ùix–#'½ QOš6¿Ä×r²¤”pÙ½#š¤í¸:¿zÎtÃch<‘Ií¥}s.ý“¬x7:Ú},^/€èdö]( zâ É(rÝãG),eš6­ è’yõ®Xö›Mã°M$Jjö mùŸÅcãܬ¸êÂݼf˜ 3gË6SÎ\Ooæ¼*M¡îÜl8® ¤‡U˜Æª»y ¨’ pä~µÅ 8ÃÓ¤ûÊé+žZ±õò¦}#ì.Büá\á<’a,ÐîÖ9(ëCë9V|ŸÂ re7™>RTy¯Qaå±…7GTS^Øÿ•lCCcoéÇ„ê1vÁ…ûIµl§K|'íó‚íèÛÀ‰;wͱ™²¢K WàðÁ.·þZRŒBª»zEŸî…û›ŽY.­`Nk/–òÚoä*húpgX"Ø´Ê‘œ‹BÐÛë¯z‡ä¿üø< ¢í• åGÈt0^­W0KÇŒùUž}£B4ÌC>[Y½ŽÙ$©ø~q´‘Ö/ËPÕËÞÄ”æ§È̼#£7†j‚ÞÖ®Ö€)•F7abÃ2Š8ù6¼ÖWÖ‘¬Ž×ÝÄ^xÆù“.覵eßQÐgO\7`,PÖp¶MØItÐÅt‘qòY"&è‡Z1A1M1/«L±-ûä— 6èÑbb\fZCOmâ—>e¡¥ÂOš§'F½žÙÐ¥eVÈduéWµ%ˆ΢aªÜ»÷ˆÍ ÎB2à¹okÐ!lûînT©ã+Þ*†€À-"‡ôøI[ûtÌwԨưª Êœo õ×Li²™¤‘æð ö*hf>gÅŠÛrÆ›j Øl†áÞHá<] •j!þRû9OóÀJ¸.þ…OÃ#ˆXxähz0Y„Çó®:[ÛFÞ´ž4?Ïq*Z`Ù¥Nß¶š†ÆîUkíOsÛ]eß$š/Hï§Õ¼Þ°Z1µ½òÍÅ&9,,´~]ÛF^(Ÿf-+ÉÄÿH Kþ®–`*d‡à‹ï€rL¶ ŠÀÔBî:©š_ ¼þÌ—¾ìòœùjµt„c2Àcô Èæýf6(!š²>]#ºª!Ⱥ,Y¶Uò¼w0_}¡®è”×ÍXRŒÔw|qaÒ˜¼ T!‡¯eÒJëWHµø¨ ö²ù¹œèEÍ«È ÂÂgÑDzBI ìäÉܪ⓲c.åVòãlÓªìÈ “_‰ÒCâ¨2ö½k5‚ªͨ†"“BÎlÛàã@5ïÙ#½ºùˆIؼ¹‹ñ„MZ:8~Þ¿Ñ*‰f\öÀ›$ïfަìrPl/‹ŒuáSRÜaõ×+ËË çáA/&8ÒÔó¡l6¹íÓÿ˜Ï´7Öö7 ˜”S½ÑV>å+ÜLVÞ7Ê`ÏŽè‘èºIqá%˜ŸLÜÚ¿%ÃñI8‡(`oP¿—³(Ê娡þüeÞδÇÙl«¾ÏÙéôH`¹™tÕÜ)›´×l™äNé­Ïu.ŠÞ·OÛ–Ù1¿<“ÑÞy‡í@$?/:šExÃä_‹‚ŽøÇíÂ÷ˆ·Ô{›HÜǘFbwÎåÐøÊ6v͈ïݦ,=AŠ4͉Hy×ÏûñpŒ›î º{»Ë_¯Æ±‘€µ0Œ=Õ{M#:r©7heZ’Kêþ¨í{¸{4ƒÑJUkt†eo>} ‘°ã×ÅöèÈ06qdê5hVjõà„ÚQÖçÐõ~˜rký¶.é-µ’ÙÅTc %ük³UbéFk¸çx1)¡´ç­þFüÜJGK˜-$l#'v •¬­EÛqd"~ÿ:x·T)"µ^¬†Jš†Âi2©£ê¨Á´õ;*³ª:¤»‘>Üã:`±œ"þÀOR¯l(Õ«Äêáé,&9ô<<³¬ ¹†á(”¼ïüúá´ç7‡~.˜7?=¶×õ»ÊHiЈO˜11U o³½JÈéÍâ”çÝß½‘Û£çœa¯P+J?î"t˜§²“3nh,±±nRhÝw½çù|<å ¯ó‘cµ™‰›vµ0÷KúxzZ¼ S­üly?ðöðºÜŒ%3½³)D  (Ïc€•2àaì@ÙË”l3Ç_YQ.úæW&nÍ”)Ïcik2ÔùÕ&%²Ìôù<Þ›R}Ö‡BºhZ¡ÏVMëó ÛwE®6˜¡ˆšì¿‹Ûæ&ˆê¡Œ×jJè'-g—Ü£pVe¿| ßXC›ŒB ·«·‰61¢:ù½ÏÊþjZìwÍuÒìˆ+(C’¾ÞaAmCÊx´ÿ-ànýº×0,!”^¨0Ø•Ÿ¿ÕæÇðÀÏaG.ॸ/­ÙãLq|æm$UYèÆIóBÂî ÞHêÁ¶&úqÁˆIâ@ßMUµ̈ fœ.Îú1÷q’è¥ÿq&Y>¢¼ëÇà%û-?ù5ñkîøaÌÒæð«Ë/”Áér¤f´,Uº¶qXœßóNúZüä¥C¬r—[ŽøÎ ¤æ+4ÒÂ’òQ² Æ*f룈âhëûLu>˜²½©à<ð)‰ÊöûNB2N´v¸ŽfLÜ:$CØËh¶ªS©õÊ*jîgúà±¾›[Ñs#:ñ|£'wɇhólzEQÝÛoÔñt±ðË]í¨ûLùAf÷!Ý×qŒWðñ= ¤êfÀqÔ(+ÑÒ©-=×é`Ô@YeI†$&Y'޾æÔÅÅýë^ÞO횘¸Q‘¢zéðïѹ ‚tbË….u[gÂEqe¹û온ǡŸ?|îLJVù) õ“‹S-ê‰íp{´èð²Ó5ÏlÒµh5¸Æ›¹6›ƒÍ¹yÊ9o÷Žqôky-ØïôÁ4ðµ{#­&³= ¦vÄþ˜sº}¯ Pr®Ž¾6~ž®ÄŠ¥©‹7XºŸ!¨+Ô¬”»ã´³Zrß[(ùr©o©Žrž(ßIÐSNÒyGƒF9ô`Rºu÷k$”Û3~ÂR£•æR3æ9WŠ“"½½eÛ¨”ö-O—µßÖ‚ÏW›z›ÆÿÂÝÛ2qM®Ìˆí$üí|É.\ Rò}é»+†Ô¸ Ãe®¨¨Þ¯o«çÞÆu[ç¶–½áçı4"8Jx‡ R§õìu‚Ac¾¡—±8¸ð½¬Ø‰IçVž,`2ò+WlP«ŽE}J-ñϬž¨"°o³Žbˆ¨ktATv5¢rIsâ%%ru´ƒÔÃ(JžYù}f:âTÂ݃:çÎò«#·8C¿H@m‡KÕϪ(’Οz<Âô^ 5‘”]L8èZȹÃò£sÑŠ G´8žðX!|Ož=“ØRØhùÅB8æõÅœm“Ç 6½º6,—‚Imé‹•טÁ1?ƒcÝ_Têíj¬qœåêdšî.k¾Ø‚E9Â{ƒi²Xg5åï2ÅJ|ê´´ŸßV†øÕî1â:n}ÇoïÀå'â$û ‡£¥FùÁvK¹­=ÒÕ{‚¥«Œrø4IRO·Ó·œÁØsz#°Bk0eþI‚/i?öĤóh1Òkjd©i…h”{JÃ~ sK&ñÒCÅ™†>?^Ž£Aƒ,㵦”+Êk 牜²ßŽÿ §g´Ê”±ùÀ»Œ—þ³³ˆ/liæ/¦Î`ÙÛ¯¶ÇÿNæL³Ò8iR,;Û(“`sƒì,#‚ùšÇÈK™_;>ù…@òBã>êý"{»`÷&NÉÖ³m ß—š8Ô¼ÆPÀ„Ùáëáà£òU™¤«ÜðœË°L^Z"ú$£ÿ£i T9ÉÂö’õSë,RýÖQ`¢Ÿç—¹:ÔŸƒC§¸þµ– Ø´ú’%6)µ-xA_×Ó—HðH<¶×óôê÷óôêãµÄ}²F®ÀûK†âSK‰‚òÀQq ˆlVF:žÕ­2ÿX˜·®ÛfŒõ†y´WÄV½6P*Âãx7g ó`²±Í]it[¿…iÇ °/ûÈ)FÒqÈÿvuH®ÖŒïK]?ç~,çTÔ$ÓâÂW5Œf¦fÂ%sÖ4Ë´¥rœ1Ç>´’ L«>'XÌ“æaŽö·Î§•›öGwma¶¥›dx'¼ÈfõÿGÒ Õ/î†0ðYÍ¥m¬Ù>¯K·™Wöù´™ËÙX‹-hu2…wqåÒá•ø8ç„1Œ,AÊ@£.!ãùìÐñßš9™V1ÒrÈïºZ„0œ§æ=ÀÖJQeöôVi9k¢·hUb޼)™¦Ùª¢¿¨oIíK´SÁ Ô ¨$ 0ДòK|=åðíöÇQ®aLˆ,ìMÐÈá–O;’ei·¼ªV 0eÕ@¼‚Y'Š5*ÚìGÕ³×ík7ÕbÈbCIœœCŒÃM–ÑÇ‚ Ž‡ èL èGœ­I¶þÕk.Ih›ç»}C¡ ¹Œw\{ˆã×[KÒ«oe%ô“¥Ñ LÉóO’Ææ»j°nÿ£È †¢hÚN¸ªPÖë×…2îÏàßkþ¥æE½ã~ÿ­–2ñJ(ú¤y€’äbõ)Ž\#›ÇÍ4íáÀYåör8˜aζU,*´î“¤õëÔl³¯6†¦ÈmñGqy‘¸|áÉ>P?Ü-çÓ{:­¾©òB›fN0õûé=…§cUð÷w?+æßæ­õÇÝI‹ì°ëÕï.'·«£hÓHùù€·g[L@ÓãømŽïi\î¯pã² ßB“õv2•¹óüföx}e¯cE%°¸\öæ%äÁïgˆ¢VZìÒ²Æ*{;åN‹¤¸«¥êËòF_œgVªˆNšÚ;PE“rÂHÞR_”`%˜—¶Ž-@",°wÀÉ>ÂÀÄ&×÷†°Fz“Á‘þ‚wý¤ˆ |^ãÄ}^¤iÈŸgH  Ü PíÌÁÇç`Tp ]ÏO@ŽþYZQïÜxQ[LÍÐ"’²eÙ³<9æ8·d£ýtÊõfÞk‡· Y-·eÞKJš„{ï¯úÞÿQ ô¦)—Ëå ïrÚó˜q}Ü d㋨ï¢2Ëó0°¬n:¯©6æÓ¼S;Rca(vø${ä“1âH<á^j½ê¼‰ðÛÑÀוÈCqlK¬Õ¸©yµMv?Ÿ;Œ2e-KRl3;¿sóPoÛÅhÃHA›ÝÛŽ-ú¶½¨@êNãDË›]@²AÁü)µtëu,J2,6¸P K¢… šŽ8ݼþþ¦ìcÖC4Á?ØxÍcé ëkÛÎ õr5©‹¢N¾°ÁܾKïlQ#„Œã¨Fƒ <òæq‘Aò¨¸á¸n«ÃÀA-XC—†ÙB¯!ºJF÷ùc9¡6ø%k}Ì ÊeåcÿtóµIy¸o›í5$yÔÈÕG"a'—ìÛkQÿ,r&Údóǃa—Ê ž®¦³è5ëððLØüÇ`‹÷Þóá%5€RèÑႬ3§åà°>µ®c<ùnSžV [\õ7S¼ÙhÚ²ñ]RXY±ŒlõEq6ò1›¿S"àÕpß%ÂÙ#íŠ7&Ÿ‰Å>,h7ø•ù¢ 3êœßXâeq¹uC€ÍŽ}œ.˜=r9í™hF0M ß¼ÜL.MhŠK TÚùëŠxf*|¢XŽù_‚,o%)^Q¶F:ùÝ•Ë×SŠôJ5i™ ²SæñƒDƒ1Ô¤5Ç^Î èDʤ}5†×«œp¾N¦£”µD"‘)ÛfÁ1ÙmÓÖ|\r›‡I—Œ3÷£Å÷æÍtoÌTÛŸ‘{¢±0 ØEÖ¥@êóeFšÂ¤"bºÃ»ç!Ô2„Od6s<š^¯ðÕ›¨O“Ròm[_E Á4Ê~ßFÌntA#`="_½‹´cA´0‡7ÿ¸)éJ_Óªèó_Qp¦(t¦iëK@OÙö¼LÂvÜ3£ÄÄÞð(ÄöI‡0ãЧù©x^¨íSÑ…8k× þ¾íR/D»oCSðˆá¾ hú äø¹zÙÇÊæµn6]»ˆJÆ“ª¾´Š¿E˜l²Ð«’^;__àªÝ5"l;D~¡ô±##3Í£x´lË6Ñ!LƒÂv £Hb={yotù<–E¨ÈÃEí0Ó.– ¨?à&ÈP¾vt¾5ûYfóq$Áþ„Þ½ñ ]¬ßeÔµ ’4Ÿ3Lï1t3(Øý%ÓÉù'59VIÆÞÓZ³]C îÙlç@¡ô*ÊŠÐt†9ÚÙù¿.©ß|йˆú”î‡W.ýâ‰~úaMg{«8Ù`Cµ$芶¸F_]Õº’DU;Ö²à&FY¡ê¨ÐÀ#hR/4#m!÷¾Äú¾–üÉË‚íÌ] .)ê™îGÿy2Lй¥v—6è[°£ n ˆ.½ä‚—€BDPêñ=ÒjåÃÓùV_ÙþÏ£¦}5Åýó§÷唿]‰tDíPÞhðü¸'ª²xV‘²Brèä»~6H×¢yiÜzôñàIþˆ¨vð”g±ôRÿL›<j ŸÌqFèvJl¯iõßöÂÆÞzIµ›!<,yÈ}ã ­Í)Å¥/£G©SYPIJ±«‘ÙÆŒÚ9”¢±}'™¥á<Ìó_ª0Q›cY«øÓž¶ãnp—¢Ð¶Unž}g’B@w0-­?ƒEù:8\(¥^¦J|^NÃAµíR×i7©oì¡ÎσJ‘ÁwÄÊ„Œ‡Lí³úPÈî¾2È~\«Ì&E÷쾩Uÿ¾ž¿KÚb@–:cœÏ—h#, m¦þ(àb[`ü}äÍ>œM pTÓ,c”•hzA\Ê(_›Í¯. `þ”R"›û¸qÏFÀ€Ì+ý´F*`_KF@w|üý4Žâ€/¡Âæ"\ˆ'ì²L%Ö7j#†'¿ŽÖ‰%OMüÀðØ,.Z¡ô""Úc‹*á‡ÈwT‰Ä5Gý»Éy‚›(|)Ë©ûØ—™ýe3ž/÷®ëÏÑâgÄYÉ’bP—„³ÌE4ëv¥OôèȰkó•çQ%J‚JޏF¥|Û’‰Q¼UI,Ñj§+7X}¿÷“L¾»LnɆ–[Ë¥S´û»ß’¿ }H輡Fž>5œ%÷@ÁÝ6Krí5M^3(`êããÒSñ[,v¾£Ss%s—žå¸ö,âÑr†½áQÿŽª+Ï×ï<ÉØñ)[@€Á 2´*£ZœDábx€îl‘«î“ζ°!ÌÔ2o¨åá A$G{XÓ—N]_ŸýD6Ódõï}¨2€„ë|FQLxbsáo‡ž‡b¿_FÐÙSpÃø,~Þ¤ä­pÔ³±P(Œ‘5 )­‘ÄlŠXT¤öþóÙÄCkâ iíóš˜GH<RH‰{?Ú»‘“ŠÁλ)õ—ŒÖ!¸„JD‚˜+–PmÝlgõ WÁ#Ö2OðW{ìØ)“T ž5F¦”Ùšëu§ëÚŒ²‚äð©Å _qµML¼F¢¢%#^#Aåt²ÅI·ãœµÇOÃ"õqÙ}ó¬,®W>ðhþ•o_kˆæîp/…»&ƒIaýìêJoÁ{ìr”²á©ƒ.«§»x~µ¹(וïAx`) Xºp¸˜Zî%úubh´keT"‡öm4Þ‚åÄ+R{5æÛí¯ÒåEB‚'¨…NgžÛ9ò9«'bº`R úYâoß«XB‡« °^ƒË´½{ ß8!Ñ{–¿Ñ*ßQ¡ÉHþW4–#yÀ2AÍØ×¡y¨Í:ØÒƒŠ4ߟÀK æÎš·&4¬§Èž»­eÁµÕ3"'!Èþfêí¬Ž+DÛ­ ©ˆ¦_.pæÉŒÚ•™´'Ú÷.(öŒzþ× ó¢ ÐeÐô·Â×ÑÏrΪIùžð]ÓÛã³H?pd âlÏ0•%$ }—N·HbÐYªú¹{R"‡°±Q¨lß ‹'’cr»:-xÒ£—ûkwDe^;¿ÞH–—€ù¹žD³,OwôvAÁœkn ,wLe©‰IA,l­ Ñ€ÝY*9i õÙÂá?Ö€”®“Ïv%r¯MRÒ‡eÌ@­—nŒÚÎã݌޿«º"hïcóŠÜÏ,¼ÅüΕ+‹^¬§ß§BÏ3Ë„½À*nÐ-YMóM»5^IÝú,*~?4F´cÙ ®f8:i0±SHÂù©6<Ÿi•zP C…Î!#Âóºï"ùëºÀ=Å¢†®Ï—uÕÔ¢®îÔÍT¯õVT —!‹LÞcÃAwÔÔš(¤[vßW¿m?ÎÉZ§n')»<ë ¡Ýù÷/­ ñ›Š¦, kE“ùfÂÍ :ªµ,‘á+!…òŒ\ Ò¢^£OÒõ^ãìK&€äâ*Ò‚—{‹ X„xnŽl=´ÁC6¼oñ[û„Ç Eî§Cÿ[)mP›Q½Ž„b…¿gÖR‚dÊOÃåÓZÐ(ûå³’ö‚¡PhTcoÄu?çå›M7´À´óŠDÁ‰¿»”BIvu ‹øÿ?†£ƒ±NþEeŠoè§œ\ø'yºRúy31ñ  Û9¤¦Ç¡{Úëòë ÒÝ0‰Þ_Óg`Z§›<ÐRHo–½ÁÓµxx ñašvþшܜ˜&U~4¶i²Ë½2åÕ@å’ð”Б)â¹HEò¬Ï‚ w¡) ¼í8}Y…Œ]¯ÉŽš^,|*Ä * !”hÜù>ûoü¹1Ók¿7 γ¢ñUŒKpøºÁûÉå7ö¾âôX› ©‹/Ò¬œk5)tw†±¿£ÎUè`w¿œ¤Ÿ´aç°³aŽìñÔgbøîL”¾…$œ=%â£D9ý ¡uræàw. üi[ÍY"N,lÝUD¦Xˆõ@"±kò&Wê¤Ú…ò›þÊÿ1’ò·ž6o|Uáa‰edνY_¶Óú¥KkDÑ!&™ŸšüÍ\ ërÉzwëËÐn‘¤rä^ísQéâÎÇýuεÙ/P·[9`K1”KI÷dÆÍ…¹ ÞRܲ ÎtÑÖãCn"àœÆ~ÝN\4@îÊ¥ ãö@¦ùê£ i›`àkª¿ü‡äIÇ @Îqª…Dæ "À ´®FnØ7¡°š!®’Yå2GŠy_ÞÈ£/È£ˆ²&‹ª%Zwp×–l«W}ßôˆS™Ûh„êŠÐ¯Tä¶¢Ù8l~÷ò~jAŸ2ãÕK¢ß PËæµnñ¶?t {µXxx }àžR.ÌQ;­2”ÈLñú¾:¬‡-ªÀ f_ã¡QˆÀ¶{w&#Ï+n%Ë‚-5ð™ýT|˜‡üCÉé‹ ö2/õØŒ¨«‚ߤßùG’ÝäJ ë@‚ѽΑ£+îp?'ÁõõVCÀW š2Írü¬QVàõZw¥³É\,Ð9‹B8J“< ÃÊdçjßr·Ö=ÞHUu]0Yj֨џã•Ö -ÖàKùdºµÏûЭµ-ïeÔÃ˪ы@º™Ïâ`òk–}}üÙòùíá þ÷ ºH ¬Aöæ t wmÃòšÆ} |ÔQ»Æ\ÕËÄ»‹ûô ›Ê‘ëòYŽÛï\1Òÿê„ÔùÏQœ4“Nþ"'Xð€µ&Y“‹ J)¹TY("@µ‚L {©Œà"#8Ú\²þ®2w“ ¼_ƒBWÝé­u–z—«b;ÙCEmv**(^x`"Bާ Ú=Ñè]~x.Tï­RG‚£ä ùo ˜¯{5¹UkGäœùiðÇjfÎð[Ƴ¨õ<ûáòør|dõóYÎé>F(ËeWwëfd’êW÷@ŠUÇï'õÐüˆqòÃZ’úܶÝ×Ï€Ã=ThfÏ(±Iø©¤x‡ÌPç²Æ„#ÝT¯‹íñÑ$Baü Ó˜Õ(`?»¹Ë‹k·¡¨æ¶¥ØÕž÷ð‡Â¿ RK”–¦Œû¾º'ÌÁÁ˜$‹u Tš—ðy±ÿ^¬ÿE)¸m3‘áx:ø.&šô0)‡¼º®¾-Lå³¼á…t%Gãz6Ílèa­<ÐE1ƒãi”‚ÜÛ½õ¸ýÈe—@i_báJ—T®˜íÌûý2X#Ûp7$öè›êNÙ†lFßnP…´ÇE )šy«§ч‘&) U½#¢Å‘Þ'È ‹Sj´-(«Œ CÌÜÝÂäÒ÷ÊŒE›±ÜtÃ{QˆÝ$¼„aØT³#øˆ-¥X…z5ц'ˆú¿fÀ×€{—u{EŒ¦”3›‚simž·¯ÌLup–¯6ˆ­bøº{PÌ8o+gÀžÃþgwko86™2®£÷óJyXdhÀ)w il~‰ok˜|Æÿ'6¬iÀuI..i`ž3”°ÒBOŠÉ”üâšÿk1ݨ?wir(÷ƒNƒ ‹Ãº–@^^X{ØE4£¨~¤ VÆöi¾IbcêU:F_0 Þ6ÙOsºý}CNÒºÙó𠵯t¼Kü/’N%Æ;µ”R¦Ó\ž7Xê»B§³î|ÿeXËSCQáºd/+:fïááS±Ÿ =óÐçO¸ûÜ1BšHø*èhUõê*tt¡ Ô§ÖlVd›Ä®Ü4›‘)K fÙȈõô}(é™Ïz«L™_ùÇ\§¬11Áv! § Hø{y¸Çø–û(Åëû1Ôʃg3 Ńi¿N“`¨Æ¼ql;aúíN»)_R”oÆ-0ø-ϹY)Y{è¹ÔÐ ¼~V‡çw5}…Ф–ïp™0ì¦F²˜†LY4ÿŠ:!z=wàӔɚš‘4²€÷àx™ˆØ‚Ûñ®‹DÞÝ|>ÎÅVŽY0sêæIùÏs|r¶²/(‚yS™y†ÞÕá•Ms¸ÇžE’Ú,¡+r{³Ìl‘wà¥˳œN²\„6` 0Ýð¹AýWz‹V=›š÷nµWaèk|TÄ£Á}eT ‚x¼þðÒó’˜ÛY™ÿB“dþ“¹ëIÈ q×hªt1gÚ¼^2¢ŽÅze“'n\3Ý|j\À¦!æ.•ñº9ûDå0¾ýúmfP#{"×ÿ¤8æk ½2#Ü[„ NFɆƒæa¥0#p 'Ôc† ,pàž„0œ¢¿ÒP“-$Õc ŒÀ!î^c®M€WS­°Êª·çŠê=¶Sç<žª\°áN L?™tÖ–xÇ\†zÏ’úR!P{³= €‹–È-DχlÙÆ—± äÆD_pc‘†$ü’‹äžÄeAF÷@¿<èê\¥+òFg&ò<_WoóC”#Éä6}~lÖ󛄪¸¡l˸²°[•Ò‡MÝ ÿ†äp!2‡ÔDÿâÌIÞ\­»ç¾‹¤0ÉhGl6uð$Áø œbG?fw“AsÏîG¡ Ѭ"]ë`8Œ›tÚB`háĹÒÈ«êv¶6†|Þb,~3ÿCnò&;d¥Kz8¥‘–ƒ^HëÇÜ“¶sNy5¸’?é\ya¤ÍAÄ!¯ËRê—Ó†<úA>²ŸàŸwï¨]ÃÀψ.‚é/·c‹!|9˜4X‰ò«7õõ9ÛÏ¿?áÐoÚÈsÒ…qhûÊ@ýåi7G]ºø¥¤E$à•šr$ƒŸkŒ ÝÊÐlÕ¼)è°ƒ@; ­z=›rQÒ£BÙ¨I`$@[ÌèÔ¸`t§5} k€‰9þüE¼á‘›ó·Z¸¦‡Ô÷Y =׆²2†Gz&]I{™Ðáhc};žš,K vbˆõÌ>->?fÝí²wÂ~íWÚ#$¶€lhL3ê¬x´H½õØø @¼!§sü×~ ].¸]Ÿã½«£¢tHk—\¦ñRøÍ ’hµŒ¶9~òtßÚôiÌ[Šô«z&rì–ÄߢÕAä×ë3˜kü¶û˜ÊúYý'Εei¨«ió¿uõ49÷µ3ûü„ÂÈ9{ª%Q*éˆ|F_‡Ü çéJÙƒ£³+àp=h Hx ŸâÕT­¡|$ç…Qú—iä¯kzøž‡†ïPt)¦”m®;¼©t&ý÷°ld;A…èįUÿ©-K^>]A ŠjÑ—ˆÁvEÇe²D@þ° ™@ùˆHÀ*‡´Øüä4È>ÍiÏ!0ÜS;”ÄÀB€Ï2«ZpçåtW';%že!)§˜èh© ZNÀ¼Qj¦Í³ ø™ù»*ò’Ì´¨}5\–µA\½riÓ섳Òf%¦’-H«üRü$òûG!¾ ÜVçiÿÛh«s`½»WySÆçKJüRV-Ï™1½Ïí(×öü‘$çp®ƒU/)¨êWX ýGYJçFyJî|€Gér/Ѥ—g"Ê=|‰w“ñÀ³u&¯Ñ†ëÙ®ñëOÑVQDéÁ—83ÆpµecÕ· † &.\;$ƒÕýµPnÛÐKíšh7Å£¿J4«P&uAZ!ê‚Þj˜*l Všµa\úìù§Í p!øEÞf¯¦_LÐ{GˆÑ.Ñ»»KØæŽ%·doÂö½++Sê!âc¼»ÙZb]~÷‡¬Ü Sb-^Õ=^}@½ƒšF‘‰y2ÀšY¼þz#ɲDÃÿKœ¾O[PŽ/·K†ØWmUmhdØÛÇ’èÍ^CÐ$€>~Èv5ÁÍÜPä4ÊãÜ|æI)QEàW©ÅÿÜT¿ œ O“z#\$²¡wÝ-HXŠ5=wsƒ—è_˜t˜‰§wɵéÝlVA´"ªï³§ËòÅ÷{+¿÷LQŒrˆhè$„»¨E4;R¥…¡aÍ¢À¶N:-n¹úYÀÝÅ*ã‘¥VàoæÜ€"Ìõpro$Ǽºr‰ŠMÒc#d¼ˆ‰@|ä$%Nß o5?q¥yû«NDíÁÜK’*žU)!T¬ú[Tá˨µßGÈÎì×QÆ%š¾ã$|Áˆiì7¤¯G«= ¤v_ìVÊ’h$œæ+ƈ\WœµEí¢­°Ü³ÇJaôXgãô Üf ÜFm‘ÍöÍÍC‚Õ)vŠ@[RÄØ(¼F¼‚?¦í‚óÜ‘ì;ký™ e4U÷ öꈂ×Õ(¹Ëáf?Ža;ÿ,ÓÖ ·}qœÚ ~ðôu‡6= úî2 3f„[=\ÿôŸ˜2=© ¢ Áï:G¯K«¥Æª”ùë§Ê` ˆ ŠÅêkËú—d„ñŒC@ÿu)ǧ3`ƒQ­U+¶˜Qa· £pZ£\HAåèNÎ/ Š+3_ÆCœ¯Ú†è[™ _î¤XG mðMÜUŠM¡%±ÙÃzèïVm:ï}µ3ƒª/l» váêJQæ8yåÄaçŠ<0=úPÒ®áÁâm}ôýbÛâ4ÜÜ óAtÊèWC>€OÀÝTøA`;«wwCưÃÁ$-åÖ#ôrcÑ^.¦é n…ÊÜJíksiÓØéúó,¡Tî:G=‹¼!«ýªÌæÙÊþ¿)ÖšFd*Î,ŸqƘ²²ËRbÖqà<ØåÇG•hD+\¶ñ¸‚su²B<6:@½ª]•Áb°CŸC®°itÑ]%‚çê+¤UÔvý̯f£@G`²uh§ÚHfU¶ÑÖÇ€¤z-‚<Ù–§ØäÔÅ_.^k;×X±&G›U›ÚcMmüoMj§˜I˜$bªÎEg¶”måöìg=YçJÀ®‹­;K¶‰´´? (¹øïÈÚ4ÈsåáL®¹æL S¹_tüÓß°Öéö‹´<@øà8Ämi…- ©Ò>Ä!ЧÉV§¦lZ^->ÒÝ4ú]nìé °!Í_ð –„ó¢ aÙ_Ü Õ¬¬FüK ïÀž¯çů4…§9“¹ˆ¶¸~çÏ/&ˆ¯xlr雸£EKfný†Fç¿_Åù¬ïN»Ì±Hƒ.n¸¼bVÀ¿uÄâú+ ¬k»ú³ÝFºETë+. ý ½Ro低è2i¡÷0ËHÚfàí…+”C;ÞYD)O NŽÚJÁ˜«{Ò¾¸6œ@mØ–2ŸÇŠ‘qô­Í œÉè@ƒîcu bôâÌÏ+-%."¹¤)FƒÙ1S™¿–FÎjëÔó~ÔÑ÷·šB²ÝtÚvõT$by&uÂmRvî@I*Yo½Œ›ÍhÐpxO +ðQ0Qˆ 8 îf¾Ê¦•–âósæuKæ'‹ÖÞ‹Ÿ~&ÍaØ©Â\xœ‚ØÖÆ÷”¦•–·h¨®8ïë#ßl “ÅÛ ¸Í2'í@ŒEÎ&>´®ÒP[!j»ã_˜w‚L¼\O莖[ªš‰ÌøðWvnËëkL2÷7ù·è2Ì"äFQßvÚ•) +TÇ¿¥×T:YÄ®“T‘eÂQ¶è£F„Á%­TsŽÚâL&ÈV¯ÓQ=u»„¸t *÷DzíÝgtpô9åSbìµ2‚Ipç4"¤Ö?¦Þñ”å1‡™f<—Á@]ÔÕ=B™ýd.¹À¤Ù¶údKº3þÙ’ÿˆ°U h`ë9®¨Êëêëa³q@x«(Á¾4\eV`듆ûmu£“gZ¿kÍ8ÍØýô€a€Æž§úC\¿мƒ5àê\ \ öru¤—_J endstream endobj 524 0 obj << /Length1 1373 /Length2 6132 /Length3 0 /Length 7073 /Filter /FlateDecode >> stream xÚvTlû7%1º[&!Í6RPº»%¤Æ0`l#G Š”„´ )­ˆ"HHƒ€HIH()¡¤ HÊú<ïûþŸ÷ûÎù¾³s¶ûê뺯ßï>ºbf)©î†v…ë Q8IˆX ¨il¡ƒe¤À`i€çÿK º Ç`h”Òÿ²kbàPA§ÅÜŒÑ( ¿"„È+A”À` 4¬ø/G4F ¨ @¸¥€h ÒDûcž8B•"0Q DQQAâO8P Ç `PЊó„# aP %†€ã‚ÿ‘Bä†'ç«JA‘X)4ÆCETˆÀy-àX8&îü=.Њ„ÿL ´òD`ÿR[¢ÝqP HPø `p–àrƒc€„Ú@K}# ©/õ—³Ñ_À¿¯‘‚ü;ÝßÑ¿!P‚¡0é E#P@w„hªc$… ÂI¡(·ßŽP,š €"| ®‡?C:êæ@(a¾¿§ÃÂ0_V ‹ðù=!èwÂ%k£Ü4ÑH$…Ã~÷§…ÀÀa„[ýY«7 ˆÂÿuvG ÜÜàæï ²F!üüáúZ{T€ÿè<à8  VPá~@xÌô;¹U°/üò[Mè? ï‹öºF€‡!Üá„ €qxþþ)  †ºÂ=(À²Ôp÷¿dÂæ1ˆ à-0x ø÷çß'G¶ÜÐ(Ÿàÿ¸ÿY.HÝLßÎÚDüÏÀÿ6ih ƒ€xIi ¤´HK‡°f1ƒ"þîüŸX}”;¨øW³„[úWÃo_äobˆÿ™ËM@,(ò€;€åÀ0ÂäÿæBþoèþåÿðÿîGÇßÇçUä·ùÿ°B‘Ÿà¿í¼úãØ7F€úoWø_t5†»!ü‘ÿmÕÇA PGyøüûXDÜÍ ƒyþ•¿ôÖ¿ æƒ@ÁÍÐXÄï( ƒÿËF`Ì›ðh` xüc‚HóÏ’Ú(Úí7»¤åäP  ¬˜ Éñ ÝàA I¡Ð8B0^ÐüÞ§¬"Dx–~+ÿÈr²@–»ßò? Áü1ÍþÐÅ¿ä?œ†Ãƒà0ÀÌvýŽ×‹;¯jÕ¹%W‡•Ç…Vm²E%ñ3˜Vÿ:Š ÑgyQ ˜CõŒ.†+Ú"j³|çøÍ¦—÷šÓÌ[NCÏœS-ÆV[Ó£loFoª×õòRñHZ©­…žû…Þ¼íMÚDÜn Tèçά˜ù(°G7¨®·jî]ÌÔªùÚ3yC곪÷’÷­n—O¹>šäà'ÇIòRŠ1íÑOŽ3Œ\𤊶îË”âí¥“Ž'C>=±’Ævp rÚsð’0½»Š×ØÈ4`ÿ€¯(/™pð/‹“ùØAä¨>µL¥p#‘zí¹j?é•5¥Ÿ[íÔƒ( ÝØšÙÌÇkçÕ5¾$rkëgàƒ‚þ†üoSà þö³Ç šG/sX—åã" ®p)+§óíaføTfùt÷93k®Ä€hùÌiuèŒ_†÷ºƒ—¹ÅŠ "ùüW•ÃH9fšÞ’3*·4 §êú»Üœd{#ŽQNÅ€uvv®÷bÜTßëÅc½=+ÇI¼L7Z?úm‘Píy_•H[sVÌy÷k v™? ¥zX6Ãeû¾ýÓWéÝ ýdK&ZêL±!ÕŒzòX(ÅçôU›^t[êNêù$×Ûš®ˆkžpìQ[­9=âäÎ@³¬¨NQê1s@ãÛÇ‘f47wV+ئS:|Þ©.^»“{Ÿ]:rë;µ«­EÑ”;_ëmö¨½4LÜ:ç:£Í¬§É›ËÞCw¿0<¥ð×rc‰™–I2§<ÌÒà´·tö—¥ÙȯêZ,k^Z39¾ñ« 2Íý~¹ÈvÉ;C}\?·IEˆûl#l<0-<·j•s!ZÎ*¨/4|á·øÀL_ NÒ˜)mdãf÷0]WPï–Úü뉹}Ñ6qWQ//8m`ãÒÌì™F¾—«ØHyá¨Á ÿõ“îCa|7äC‡šÛ°Vx°-¦-C«ÆÔ>¥B{@j$å£òfšˆSE+HúfG#»hc×£¯ï{û>‹,ìm#w›9Ý›9).1ñX$Iƒ9\æã^Y!÷AćŸÍ™“Œ¼å‰¢ 1œ6æE>ç*}^š·w6M%îô¥q*@½î5­=øK7ˆ¯*€gkÛö•~:ÉÀ›—)úO&U‚f5»ªÚ7åÆÈ¢Ó÷w¯;}I£9f™î)H!Ý“•,‰‚w}{=ÞRB© ²ˆ[ÙÊRMÒªóƒûufv1>º_ÍCY'YTXA¤½½<ø˜}Ÿ-¥XLýz©&;ÊnBŒ7‘:9¯ìU‰V.¼ýªOßà”§àîøîž&?ÖU[(¡ÂËœ(kŸÍzÕl’ÈLØ›¼•=;0  ¼Ý¬ú‹xŸíñÆŽ@æËÂ2Å*®ëû€—dê—DšÓQ+Ć}tªGúsëìäM÷IŸÄ¥?© GÊw‘߸édèCÊ7r39øgÍc~íÒkôº GEk½Ÿ{^õ´iÄzµÒ­¿Žï¶ÌvIqp¢çºxx*^ê˜/íµ6ÓôJŸÕ¥P‡‹í9]O«> fdïÒÑ|ØäÑ[óøà~Fß-®\ż{q·:ø.Ï1MæË/êë°Qôi‘Z"Õ[tºŸƒJúå_‰œ3sØ•õ{¢ÀS6=É–KªDþLÇD³=4ç$[Yö½|µ ±ÉˆTÔ˕ɷÊ3­³…}Ù¢›iøzì3å ¤CÔí¨ŒvF']O“~¾irµÓÍEž¬,mYˉq]ÍH¥ý:âü& €Ñq®ˆÍ{öÙHÎ,uœšåHèÖáHrN\¹¶êf³¹M¡Ùè¢Ì÷ÐS’B_d˜¿¥´ÍÚMa½áCgÿ­›¶ù»Re¸Ög:oÛÂ0“ ÁMvá…%/9Ügë[G'…Xû£Bøîê/š‡O('™ îjø}Þ7b´òí³{ãk°rHÃë ›7¤´³@ä•öe¥bAiò8\_ǰ1è §¤hk=ôŠ'±È]ðpÜ%±ñ«ÏÛµo¬H]i‰|Ø9ˆ/Ô$}´±ÌŸG¹ùÂK@¼o¹¯ß!g Ÿ6”œ±^•á8ÚJozTÆ5¨ àKyóôÇi(ðY虾£½Û“õò –«`×(æ·JÈ/kíÔ*Ž›û+äN*7^áõ[“¦IT˜ß_ZzÕ|ùi+šO]Z¹CãXu§äu'¿E,c- ÓÃy@"¼áô§Ÿ”v(…~7’e%¡jïúN6úÓ~î'<¿ã)ÉÄìÅ+£HøæÕ4#7û¡°}雹ŒR›²åIÑR;-NBCb¥£¼ulƒZ3¡»öªuÛwî$Ù@öˆŸÒˆÑjÝ0[ z9Ç-R‡´1e~"ÿú@…÷‹Wª™óÅ.n]4ôÃ0>#Å(^VðŠ—è`žê#ϽÂ$‹%¹ K§ä£ÄiÐÔ$šëÃË·, ¤«³Å .û€z55tÃ0êÈ“gïµÔDïÍ©O:âƒ2ÌŸ ²>‹ZØÒ ð6–+–bCd¿ÙÆñ¿p]¦$5ÂçÈbt"Mž-yQ ç¾I,4ŸHÅ5òKs°šE…ïHmWGï´rg„V9÷^fÞãXHiüå="òTç @­\Ë?ã±#’9æ—ò ÿ"c©1ýäÊPÖ÷!ìüµ×TâÃ+Ÿbh33Ù3_´šØ´ÎZŽk~¬>;˜ë@kŸ›ÇÁ¾•¨ªw Ú·{fjNŧy2ß:S·˜ÿ¤ ‰¶è‰£á@h¡5ä)‡¢I¥]Yovç¶ÙðíïÖ³Xìùï=tÚjr|© -ó´ýÞÞ@Ëê+Km¶¹Ú’ ÓüéÑ]ë·Jªè§~4u 6ô¿Þ²~[å+ð‹')cg7[ z‹»qÀêI¼RßÕ7´d!ðL!^Û•(ªw­Ù^ŽE™ë@¥;÷8‹"g¯w*å¨D€µÅÓ’ÉB½nKEºgž<šÒtRÕ‡žßo^„~Lë«i̽ïRYç0¾¹¾|J¢R“öذI5EC‹³æê“ËÊÕ›†¦tÐ ´õÊö•{i".ƒO?p*JÝë³(¬†PxQ”}óAeÕýt9q?a‹¬Šâx:>TåßoðÜ+Pk„¢¸×oèd£`tA,Rÿ¾Ý[oã¦7‚}K”ÈÖGîLy·úËØÊfšÖ;1nà«÷®ß.5øgR5œ.ßtC[59Wk Æ”ÇǘŒì57o»~¥[dNNá-ðÿ/Ùø´H±!v£˜IÞÆM~q9,.áF„ýËWº'ûGŽ Y+¨»çkítÊ òq‡›°ðË.OÉÐÆ.ú‹ŸèjÆsÂzõï[t‰¸3¿¤Ð«.g|Q§°3¤àÖ´g¹+T•Žeõ}?òs>hïðBÏ”]Ëâƒç£S’¸Ä{sŒË••ª‰¯‡js¯RöuûH. Ñ1×Û,ú¯¿1"é°Ê*ÌŒU€ÉVÇ8ûŹ*/£Æ’Ø+`÷óâ ¿k3;¿†W¼Ì]îܬÓ2Öð²|sy¯þ ;qWêiSËp«vFÚ_DN7^S¤W½ñ…ñ©Z¹Û}çárWãùx»ÝN{‡Â¤“5ø^ß7c—¶[‰™C4IHÙC*š9ǘŠ_OÉé4-÷Š}]§ÇÛû/úGð±Ç½Ò…««»šþW©ÎAZ÷jámÃi¡ƒ§a— Nï|Y—D?âÈ 1¶³ÊÔt\CLôNÞ|=r:Õ—Ý3'‡ök^Fáɯ/=®d¢¸ãR~oû:@­ÎFóÓàOï8i;½E†ô]ÁMƒ™žƒ‰´,ÓzCñÛ´<â:s?¤¨… ?n_|°™¥§›ý2oc‰&ÃÆcÎP|:i‘ÄR–²nõ’_ÿøIe³}˜›¹Ÿx]gô²îTù7áó6^¥½•%n¬[l¶÷FP¡ú¯‡*J‚ü@ëÊ{gÍXD™‰ «ofä{ßW7¬]À©•z:›{ÇuÂ}‰íØ“ŸõJ”•ô°½ê²*¾Ö2à›ñ8ˆÍ(ÝVìQ&W?'S¤œžÒtµQ(–ýŠC]ôî­†0ÏcÇÅ,‰N_fôei€N^qØîàõl#nÚʲİ~bEÓRQùÛÏ·‘h¾p.þ²ŠA²IÚÈàï\d.U6(÷vNJ&b{»,–$3ycƒ!£µóŸÜo ŠÊ”»Uð¥Ì·wê'ÎdmíÝÚÞks™,ÊLt%^Ægnqs„óçl"&~ÎÀæ7‡8ô¼=–²¿Í)ƒ—´hÑ®x"Á«X'1ç¤ã:P‚çœÃ'¶]AväU{O“Û×)ê^ªëÊk¨6ðõö˜.àNWX®–‘ží‹Ç9WndÑͨ·wê•uîXEÐ2ôèÔ¹|jΨñÎú2Ó]¾¯ø '­„Í•SL?Èœ|R<ë¸8»,Åx:3$·Fý·TŒšÝò\÷·®€áXâ»%A½ƒrXj‰Ìáçº°éµ nôëng̹œúOr‡x­øT›•¦? ÒOºx¸«ª©¾çZÏJd+ ¿“_.W47Z/ºä5ÓqÑJrŒ¥Ëg]¶ÿ™úBôIò5ߨ²[÷è¿4‰‰Tó·ÜºZí_¬4 FúóÐGrˆ*^9»¢ž£©ÂzLrÞÙËò?A½¨¬Ò™½áúb¸Jý#8dæÞ2·8Ó Âœ‹‘Gs Ù´”å&ù'èçOØ¿?ž¤«áuŸrNK±ÛìÛêU ÉÖŠÏé‘â·9€£‰ “”"aÇ>‘?zf_CÃ5J΂`©2(¼x>ÛuäG¸»âa 4&YŸòÙ«lʼnԳ‰ÊzÌ‹ªTx°§29]ß(Ê|êì~‘§èF„ÉðpÅÛJ•¡ 5¸Wæ¼B+æbZN©$÷š:Îx+ÿáJXjèѪ½I‹ußϤÍ+ ´æï[é5k3óõÛMákhîŸÔÀÐ|²øeAC3ª/4H1¯9v{RññÅw<Ô,¥Þõ»!;È9FÎ!NV=sWô­@^K‘”a°îçð ùÊ-µ®ëV¼A—ÉÇ¥n°Î*$Kucn4¼Âg|ŠÙYzp;ݦޫªÅÍØ´»ï3Qüªå^ÉÝÅßݺ@=¢\Œ$®RL‹‡ýpp ½{Ouf5£`ÇkN®ÖMâ˜{ð’ÓLÚ³ôÁf3JÔö[À\{š`àŒôûŒxGÚu”aÞ‚b£ÑíNæÄ1–j—fÉûšHñç¤ß³rw9j¼zGßÍé}ÿaƒsHü¹ófô»n‡A´»çÖjÛ¦zÎw÷}w¨œ–&ƒ`¥|Ó²GJÛyFƒ˜ì.¨HŒ9›gEÐx‘»ºìrÙM¢.­B œH_›òQ€B?žÕÄÒŠpïÊÄ:|Éq°Í_QïoÏÍuyçøl;34- f%zVÒ.šL~·À­UžLJA§Ù[s ´H™6sË]ã€çév?;áŠö‹ªÉlŠä[" ˆ²â^èXÈ7éÙUsh"}C×tÞRéf´=¸ÓøÞ(쎧)-@˜_~aoòCeQ—Œ*( ³hMÌSh„Ю}ÉawÍKüðp½k]’~œR»äÀÛkmdó#åÍÿ€ûƒ\¹×!H:1üÉŠkBòvÍ]ű:™H»¹ÊõðP-ß§YVÊf¤*nÚÔu½Ñk ob·Fqêb¨ÅU“«+å>«,cñ{W_ÕTªÑÚ†0Ò|>}!ð9ˆIOO\K(1À>ÜÆô¾êMJ™^Rj»ã·óG‰) ·øiø[ê1È'ð¼Ø¬ÍìAüôÄ/#>.…äu¼G}uY¯7-È\Ì ¯=çs8Ú͈ۙt{>FÞ¨¹¸ÆRt—68zú @1vÐáµÙÂñ–VL“ÓÓ>ˆÑ<ä݇»‚D µšm:®»?|ŒÍ‰CîKñ5.íéÏ=#ª½Öè@S-93¼H"4›_jz{\Ãêæ2v½Ê9;vñ_ƒ0KÀÂÀ ¤o›§LLÅ€ÝÝsh1–æSAY½˜¥¹Q³†™ó­(=2 ¦s÷5 Ë^O87cEÒÖ­ ws¤É 2’`ß@j@!‚ºQ%7„3è-Ótߪÿè ¯SO›ZŽ€àè ÙW‰KH±°*ß§]wMRñ-îû…Ú‘±jî&…‹tER¼.nü½õÑLO0ÔË«ŒÓ\XL³¬g¢¥d·5Ë»sÐC’Å —w:t «í)øa¢äÖóÖ¥Xx„ß(ú¹a÷Ø\™ˆ·KmäÉóWÈpÒZ¥£•hpï%Ÿ|RúÒŒ¼ä=fŸê UöÛ{3ÑŽ÷Ih&‰{_þ¸ ùÑ4¤/eiœã`š ¾ËޤF§×q}ÞÞøþ~΢0=â¤ÒWêÖçëç^áôª ;%RÇ©É9Á“qƒ;PAù#GG V2{lë¼ð«˜ÊÛ“[ <™øxïr¤Â%´aµ:Õ0ëhcìe´ÂdÊÊ|®^D5{Çà•aûÆ‚“û³)Fep8léÍ(F0-/®}/–!¯zæ¨Ýw‡ÈFúÐjLÂ6Ìv•ôb.ç¿sW™„\1Õ®êãt"´c™Nmû½ç«Ø¨@X{¹2çðƒƒøÔ]³¾¤7¶d6–bv÷#Òpa+B5nY”²\GFlÙð…/MK¼Î×ÑÎHЊ¼ÏôÒZž¤Aèä±#4Egy2öµÃÎë.oìæ+ä¼îåÌ#ðÝõäÀµð¶y‹ Y{ïÖe# K Áyš§ëÊVù(Wº-D¯q3K«Ì,Pdk`2m-sg¯e†c^k1å>ÂK*Yñi·›y¾iLýì°<× †)“˜i_K2ôÕ‰›Ï<ª5…»4§ùNÙJ$N}¦/‹[ו, 8;›°BVíVIFëØÕ/Å—¾Þü¼8eðÄ]µÕãMš5[æ+î4¡ei1sÏ{¬tüˆ˜ÚÈ' ÐêÊtÊÈÒ:#«S“_SHK7Êð<s~õËœð0£™K÷ÿG^‘X endstream endobj 526 0 obj << /Length1 1355 /Length2 6205 /Length3 0 /Length 7139 /Filter /FlateDecode >> stream xÚu4ÜÖ¶Þ{‹£÷2¢‹è½×ˆÞØa F'¢w"¢ Ñ A½DÞƒ¨AD¢÷o’÷½÷~ïýÿµþÍZ3çìgï}ö>ûyÎp°è (8ÂìAª0(B((, PÒ1” ?!àà0#  ¿¬¦ ¸•þ_¸d‡@Ù”í(7 é €âÒ@ iaa€ˆ°°Ô¿api€²Ø #ЄAA^J0?8ØÙ:å_K·(%%Áÿ' à‚ƒì ;„ Èu¢ƒ`sƒ~ÿHÁýÐðòõõ´s÷„Áñð|Á€!È ÷9~· еsýiL€`ìöúËlsBøÚÁA”vA½PÞPG€:`¤¡ ÐóAÿrÖþËð÷Õ€‚À§û;úw"0ôO°ƒÌÝÃê†:œÀ@OU[Dðì Ž¿í ^0T¼bgrøS¸@UÁ`‡êïïî¼à`„— ò»C¡ßiP—¬uT‚¹»ƒ /‚ßõ)ƒá Ô­û ý«æ økí†::ýnÁÑÛCÈ öôi(ÿí2üÇæ BÄ„……%¤€'„tpúÜØÏôücFÕàó8¡Z@¨‚/;÷üoàŸ; àv@ìAÎ`(Á²£Ì §¿ö¨ÉÃÁH€…0Šx@€ðïÏ¿WV(n9 ¿ÿ¸ÿ®–™Ùc=¾? ÿRT„!Ä"b °„0@µúg};ðßUÿ'VêHýU,ê–þU°ÏßÓçþ[<€æÒ…¡ pÿ‡à–Âb¨/àÿ7Íÿ„üߨý;Ëÿƒàÿ]ª7òåþ ÿ¨;â÷7Žâ«7Å}JÐÿv} úK®: G°·û£;” Î_"ØKŒ9êƒ.Qå/»ÉoAÀP>Ì üûA……ÿ C©ÊÁ õhx¡øø¡DóÏ#U 0ÇßêØÁáv~¨£vb€ J†Ž ä„¡0*€j/àƒüž§¤@Èð·‰ài¼áp”¨þŒuæ¿ö !Aó³0™g®uÏZÏk|6Ge§86¿ä˜‡·y_’à¦óÔä<]Ÿ*¤~$ûòU…ûD~ù&à{SnTsšAËUàµMŠáÄf Áçqš¾±×ßê{™ðŒå·o<MÃÜ0›Ð;49 <½%Iô )Ï}{Ôõ½‹Ã‘³›[5âZ„ד &ñ–a¥Ó¯ìsghYqLx¼‡HÒé“Ó)Šü±;fÍ>‚ ½„Åæ«"‰3þKUÆ"^tìtæ´L˜'ÜŠÛ/4ïÍ”¯À‡3fhÚFÖÜŸ!ÛÜþ›º†çð_ÖœcÒÜt´B˜Tqñ+Íê©î¥,©8¢¹‡_4W¿$šì½øõRÁwz‰:›ž#ç‰ú—m^â2[éõ3Bs3«ƒÈþN ÍØ=OÐòö>UZáü"¸’ý²\ñž9“ú[®ú:"£Ž/=ÌLÑÒ¼z~§Éð«$Áè\ƒËË~™¡¥h.8$ƒ'P¿Ó#F×AºñMµÂHéÉÉ[ÅZÓ¾¯Ý¬<Æ.)%cÖJä¤HŒ´Ü†_ýÒù;½xøÔWâd¾º£}ä½'÷í‘zNkÔ0‡nB‹Œ$—ýÑže‚ywzgš}¿ã*±5x½ºñ°ù8LoG:}îUð¡gy-\•"tÿ®æÁ†A 61“ŽÏ9f‡šîaû\ï=þÉ’6¡`Ûñ˜3Öì=LMl²d=‘’ É`@¼€•†ÚS‡6'‰éÐ’á_"s#ô) EAÆ’Ûo}ÄåÝòGøœHj*&š•z I‚gÔóÎv bŒ+Ú¡ý3¾\ÁX²zMÇÚ´Îçúëow}R¤Þªeû_Rs=­8' ¼‰ÖËš²?¯¡‹jÿ|µ»kŠ_¦E¼žjÝÔØ)9ÕòG§º3">òëC< ÷¬„2™áo/RSI«ƒôVæF£Tßî»ë‡;ˆÖN7ó0½ Ò‰ÉÖ/Üv¯ƒ†×UOFw²H~,zg˜¢}úð¾ô¡95£XSïIÅ£‘1L ³X óvÆPö½Óe Xê ôÕà&ZÜmó<4 Æò…ô±ýÒ×&Ê]îrFöÊŸqáí]ÐE·5­—Qš’ñÎ3„¨Ýxäù)ßcTóAx„R8hÓ`ž}[·?¶/MRÐ÷PÇà7ªîèè:s¡Ç®¢ä¦y°öšådZåu(‡‹öuWªÔÚÍN’”Á¤»0bL(±þ›y£ÖFf‹ÊØnßO㓜û-9]ÝG”oM¬éäR? N8‰Ä6æ ý”8;a Eî› mw·¹7'¶Øº; º5°{K7âVPÍGÄ‚U¾™4“µÌ¼%˸׺þ~FÐú çÛ—‹‘ŒÉ°e)¯G¯‰/†º[ÚSš7 j$]Ûýé4¦w”28`-Sו‰YzPI†_†Îl/d”[_ 1䓉¤pkò…ÎOtá©å¤•nÏìç|§Zu“Z¨› §:ùÒ“ß” Hññ Ø?ðm’zœ|.”;·» !ßÿî?³VÔÄØX|;2UNoâwcìqÙ‰˜»jLŒùis."ZöÍN|Ò«,5ê δ^6€m<Ͼ\o¹ªpägOö{^fI:ä‰.ˆ~z¿öp´8Ú‡¸ua³@ ÷6|~…ƉÆÛ #(Z·mî³Óã˜Zü¸ÂIS7¿É;Óª¹‚[úž¼jM ñæ8°©ËR%¶&lÆ”-Ú@KÙ¦JŸÎˆTŠtj{É!0·ø¡£ÞðQëz¬&Æ()Bþx¨¿çaS”¼ášvõÀ¿hk#My"â%7å)(¨fWšOe MN%4¢ýÄ™†H–ü¨ka›ÉþT˜5b¼ÖÓXÝJÇ2´€Ja8û|¢ g²Gg$íD'1=VÉœÔnn‹™ ö¼oÞb31±ðJj\p°B~êÃý,†¸~!Ø9z_ž;ƒEá—'üꑱÅí½ D²æ‰x¾\7—¿¹×QÜÐ쇌ï( qO‹ Á5;U5}~ª¤¢‡ÔŒ¼$pUu/yæÂCg6؆ùŠqf<*Nò}x?SÜÂ΋€¯Þ¸ÝÄqE¼›2eC ¹ûÍ•~4ˆiÕmàÙ(¹üëž òBF×ï NëRïÚM¯í_ÕãSHb_-:Ö¹ÒŠ²ì˜¶6¿ÜÕÀcÍ}¦ÍùA¦%“‘XrÂæKû{Õ^ã\øÜ-B(ƒwúæ£k-ÄàÚQAžxƇ>î®J³›•ö:=ÒÎykû]ÝQ§ø=¦zß©À£[ßÒ*HïW³Nø¹Ÿ ˆŽðýÌ!tŠP=E>¾$Ih«l{—àáÕhÆ’ î)ôL‡”ë€òæUoÒ +°¿ÿ¨Ù 9øNè(+»'çœÂôŽÕzßUbóAŽÊ'SœÌLn¬Bcë­SB7¹øŸƒ?²¦R×dxfÖ<ð]îáñ‰Vm'y›àòÖUnc¬I_º§Ë'Èñ25…îÕ–DWì:ÐHüÃ!œúR‡!Ê ºº"luGœQ4b–¡T²<ô…™r· _„.»¯ÙÆëNÌ[¹Êú’Kîë þ+È“æ|·ëò¤›¨¶•›ò^ÛÅTÚ¼Š·òã6·;+:º"!·=Üó‰'7ºÕh¥:“sÿ|ík‰‚´Âjé·ºó ÔŽè­û‘33OÒ†ý0pã¤ÿhsbT$40t&i—fz1ÀÁ[ða5Id©Ú+ucr3K:zUÁ³›îÌ©ùŠý€¹”Š.D¿ëÍŸE,?I"½'•ug$ê2 ‚tÙHÈ?'7g4é)o*Vphæ§D+Wè²e’Ñ hÀa½Ûu%vRµÑ©]Ó5/Ëb*&HØžG×Z»b¢)ö|ºa”‰ÉËex)›G*Ý>ˆPE· Ó3 =  '»ÉRM‘ý¹žÈ$Ãkžß’ðl¹« –L :#PIœSæW`ߌ½œ¾ØÝ'E¦»—nôcwI8žF¨Ôiæ‚Õ±˜ôB¶üî4•õà¼=²-£Õu/ Z†Î#ÈÑÈÒVrÑ¥ùúL> Ξ B3·’Ú³?³ Wó8ïÕs7ïE¿:6¾ŠÚr úž¶ÝwûOÚ‰€ç›1™Y?ÃO6ûÛ3×Zñ$Ϲ:Aq“†<\ÂÈ6Õ™2£–É_âO%¥wù¢ëêdo05IUÂE,¿QnPî•øÒÂ$ÕuÊÀ¥ºœw6¾yÅ<ºfHO@ùN°Õ ùçzÇøÓ©7)C ^·Z—žªjÜ«¯&©3Fئ¢fùä´§/ߔ嘴ÛòC׊LŠ©öÓQ¼€²´y»ùù°Š½]Tö'˜-ýÂÀ%J?x¶2ŠöÌ ˜s¶¬y sêC³!­Ã7ΩÖyÍ‚"Q÷Qâ#‹Ïi.£VL9”b+ÃRšïšîœÌÌNW“Ì|ÍwþµA×eCÀè ]ëØi5Pø€ Å,-oRsNÓPo…«B|QKr” é5ͽû°Ú**Í…7dùÕøõf\¯‡õ«/ºu›äV tòˆö‰w¸j?Ù¼È2æÄrW²ôñXc:¯{_“i3K§AL~'è­ ;tïc’è› „üõv±wVá–í“•iš–O wk¡GТϵªÎ¤7jÃ?^KŒñW¹×a|U)Ým—z”>u]&¡I¯1CÛš8®ø:þ¦ AÎtjH·ˆßCÿÔ8m2šOèäœ'£qÛ¶Ò•.WÈš¹¨85;¥ì7^G¤½§óˆ@e‰¿WÔ¡d¶+p‡€>(…$š{Söò[-Õû$µ½ÖÈõFkì•õæõã3,S‰7Hƒ`5ÛŠæ°“º¡H)‘kör?IÃ4TC•t:Kƒ“Ú1°9õ Ù[G6ë–qçÜÈO²¶>S=œ£‹}N\Úœ¨òœÂ&û@“ºü@n.©/+¸{–’ò5ƒWrmnO’QHiŽ_êÉåQ˜ÏžäFÔ’ÛÚ—òŸ,´ùŸöƒY ó_Aáý9 ;yV/J¾³ÌºW$ÈqR‘Ù›½~Ùè9V‰{p“™â~3štqe.>S¢r,QX¯´É'­•2½“övíb)XÕK×¹ˆ§6Ú¼ÅqŠ™Š62VöüÝÞâØòFïb8Ðo½þÞò&N%Uôp˜o›{«¢êmÞ°'PµËÀ©ˆµÚÛ—.e™þcWþckö7fŒ…MîÞhÆ÷ÖñYŒ*LXãõ7o¹‰œ4ýc†¿Zß'ÌnàJ¯¯ÃÃ8ü@lhIŠ´{ÖJÓ^xð„‚d6Ò¼ñÕñ9cøÔ„s„c7¾‰Ô”Ð×ÀWÇS¦cmÆ64Kœôì6ÙU4²ÀÌ+ÊQµ9µ5dÿ6‘F kÝû’Õ³vYýC~Þ”„š{ŸOIçÙæžü„ÍI¯Øq&»*-ц Ôô{ïÓžhµÙVÔyLÄ^˜` æx_úÚ© òZl–Р§GÉ•„k7yMèñ×®Ÿ£"s¢iJ¹xA†.›¤ ‚÷]¨Êd\ptŠa}Ÿ«j’HÇN{‘—Ü̇àNÚX_ÂFê ÝáFïõôÏħ÷Nð’eËЛŭ¦™/o_³×áÄZ0¦:%oŒîÏ”·ðšuC 9uÓl9”zc¤W1}¢iÉê>@¿yà|UÍðüÝ-vÎ&/&v´æµÖÁ|j w{!´ÝW‰r¶0 :ȉájÓÞ¦VE¾,Xó$±úÚÞâ°IsK²4öP‚—•“-tt4·Šâ<“ýg€ÚÅAI’œ-¤,¿»‚'<^†3Ð'R‡„¶÷¼³;Ïò4ÄÈO¥ˆDvè¶-xÝ3¡›ÇÀ)o‹N6i”/u*:ixñ³6r`b,Ž&ã}ºCNvȸ-°Jt‹ÞŽÞÞvÀÊÄ{r[†éOÅ­Ë7Ú}U™i{ÅMŽÓR1éúâ‘RlWi0«lEƒ"7ÊqrÅpÈxìÙ~†•³Ð3?ôt\›*zâ{pJ–ÕÐð…ØÎ'_±nT2 åsëiÂß›ÒÊ&ç»öjöâã¾BW©NòEê¤í×rlrÁ*“†ú S‰y'9”«éøGëÛMv7(æõûº¢J\qž«J×/%;Ñcá[¸ý° #gLOÃ…æ|Ñ8ÛÝ)¬>Žc5Ú>µIÐòò™¾PÑXžœ—}ÿ¬›¤V4׳ˆ>¿g7©ýbŒ“B.%|HA¤³q“#ˆSý²Ðq $Þ_Ï\SdÏEã±ÂΡÀÚ¨¯nÛ–{´aù©ømäºbácÌŠˆè ëU¶×ËZ9ÕÚw*¼Š;îåŒ_| —øk]øó²9µ 9nùî¯h‹‰¤û]ít¢á%°%fy5&Fðã»Vp´õ ¬Í^ÍmwÃ=7ó5ksÃ:’ëžÖ’v…m|:£ÛÄ=SßËxfû‡Ü(0ý„ËŽšEÂâtÖœ3TPÑGK*\4 x¤†Kåù=ÈÆiÉÊÒ…¢‘¸óÇX¨)gÐþ°ªv¶d¶Û"'3¦Þ_³Â¤¯Ç«"Êa35‚fàC)ã¶¡‡~ Z;‘µ4z ÑR‘¯úÄq§÷µë4îÆòÑ>‡©òQyLU\bs6uääV“ß>K´Œ0M©«­`9ó‡ô]î ©º/ë׎ø,¥Ï…e’’^Y ÷Ä=bó„­;&Zåê=êÄ‘õ੼«|ïÈt^âü ÅÓž©ÃÿùU5IE}2Û2ÂÅpG2ù,uˆªiíçÑÍd﫯â&å ’Þëµ7ŠíÐIµt†cr¯õ˜®â³@Ç×KØy¡Sa)ß»Må\`†b~Ïä–2} zÍoå¹ø:Ýý^ŠmÈß—öÈ›¤î=ÜÁól1±õ!YÅ{uLÇ)?Ò ‹ /¸=—Å­%þ°ÈH·¦Ä¥gc=¦yDéÁ^ñáf]:Z$Ž<æESD ߉ÝnÒ÷<Ø ‹nÎå;òºÁ+¬0$"Ø ÞðµÛÐﳦMøhv›ª«FæçíZiÐæR?¤,pGO1§}·ó ­å´Tfôe+m¦efIëç—1†ç=­bõR\_É”ô8ã­‰,ï¸ü‡¾³Í ¿!xãB]‚‚â1'=¯òx/(}KïÀdlsG®“Ma;d©Iõù=­èS•³öÛ'T×è¹÷ÆqkûÆÆFï¡@"êOÿ o2ˆ‡ös³} o Ÿ|Ãw™±Š_p¦Ƅ¡u\²)pQp¯ùücäKÿ‰Ȧ@Y®Øˆ2“,ÒbäÓÕjä.cë+@ìtÊùäé}*!µ—¬ÂÍGÊ_[Zì*Ü)€–Y§DµÏm9v8Õ$é‰Ów¨ƒ%¿¨AÐ[…Ø®ûÀÊ9>ð‰=]Ê»""tŸ{·3;ÉÁ’ß18ÆòIYó;7¤zpõÇâ´ aF]e6—R ‘ôo³’¬Þ¥fo ?!k>Tú)F??y¯ã»ôúÓлþð×hÚN·²!fÔúذ˜ñ>Çf¨&A0Ìï3†qîlÉÀEŒ£jU>šÈ¿âQ1¾ºÊ'ƒÎܺæ«Ïçb†ó}ܲ%A5ÞOÇkíñÓú‘=댔ælÊÊòÖ#Ýn’Ýßt¶‡-ʨÏÍ„êÛ«î·ÍŸnN¾vO›!ßw¬tC:Þ TJ“Î\Qu„¬ÏÁ?JÐëÜÈ‹o| ×à°¦I[[oz—†§GOHl&9>o×C)u]" +¼S‰¡í@CWO ‘DªŽD±’G)0¾3HqT6;ú‘MÖˆÄI–È^²>»˜þfycOÙÃ1],ÆwGTϼ%™ª% ÿ±ÕÊ endstream endobj 528 0 obj << /Length1 2222 /Length2 17472 /Length3 0 /Length 18797 /Filter /FlateDecode >> stream xÚŒµPÛ²-Œ»C` î®ÁÝݰpw înÁÝ!HÐàîîÁ5hpxì}Î=ÙçþÕ{•*ò–1{ôìž‹œDQ…^ÈÔÎ(ngëLÏÌÀÄ‘Sæ01±201± “«‚œ­ÿ²"«@v¶<ÿð‹8œßm¢FÎïarv¶ik3+€™ƒ‡™“‡‰ ÀÂÄÄý?vŽ<Q#W)@Ž mg tB ±³÷p™[8¿Ÿò?Ÿ*j377'Ýßé! #ÈÄÈ gäl´y?ÑÄÈ bg:{üŸ…³³=#£››ƒ‘ƒ£9?5À älP:]¦€¿ääl€ c@ ¨Z€œþeV±3sv3rÞ Ö  ­Ó{‚‹­)Ðð~6@EJ `´ýW°ì¿èÿn €™ù?tÿÎþ‹dûw²‘‰‰½‘­ÈÖ`²ÄeœÝéF¶¦Y;ٽ繬Œßþ.Ü .¤0z×÷ouN&Ž {g''õ_ ÿ¢yo²˜­©ˆ ÐÖÙ á¯úDAŽ@“÷®{0þ}­V¶vn¶^ÿú6Ùššý%ÁÔÅžQÍäà”ýwÄ» áÍè `gbbâäf@w Æ¿ÈU=ì;™ÿ2¿×ïãeog0{—ô™ßÿCðr2rœ]€>^ÿtü7B`f˜‚LœÆ@s-Âöw3Ðì_øýæAî¦÷Ác0ýõï?_zï³ejgkíñ'üïËe’–—Ó ý[ð\ÂÂvî/zVn= ;€™‰•Àùþáóß,ŠF WÁô'WÊÖÌÀý¯bß»ô?»þûö©þ½Ô€ÿæ’·{ŸX €êÏ€ë2±3™¼ÿaþó¿Sþÿ¦û/–ÿË€ÿïzÄ]¬­ÿöRýåþÿxl@Öÿö¿Ï«‹óûìËÙ½o€íÿÕþk]倦 ›ÿí•r6zß![sëÿ4ä$rš*‚œM,þ5*ÿ²«ýµ`Ö [ ¢è¯@ÏÌÄô¿|ï[ebõþh8½Ïãß.àûÒü÷‘b¶&v¦m ;ÀÈÑÑÈáýŠß;À‹ù} MîO0€‘ÁÖÎù=ð.Ï`fçˆð×}r°¿Í_¦!£ðÄ `ùƒ¸Œ¢ÿAœLFñ?ˆÀ(ñ±%ÿ V£Ôô~‚ìôÎ)ÿqþƒ¸ÞOPüƒÞ9•ÿ wN•?ˆ À¨ú½+RûƒÞ5hüq¿#£?èýtã?èýt“ÿ ¶wÎ÷§ËæOô_·Ãhúø®øøÞ|ÆÆŸ€÷’ÍþÀ÷p³À¿œ ?é¬A×ðýå·sqüÝ{ˆù?à{Ê}máaoñþLÿ‰x·þß+´ü|o…Õ?à{/¬ÿß›aóÚߥÿafOµ}ŸÎøßÅÙý)æ=Ùî¿Üïbìÿ¸ßÉìßol­fÚÅÆüo«ãu‘í½jû÷GÂîg~—þÆ0¿ëtúSÜ_èúF°¿‡;½¿¤Þ9ÿœðþ"1:[8ÿÑû÷Ýìþ‘ð.Øåð½W®ÿ€ïrÝþq±ï|êõ:þ‹ì¿6×ÄÅñ]­óß/ëûZÿþûGtš ,/Ø™ðYÖµÝ×á»ÑïM|ž%ßÓøJMïµìØîòˆ›L]°éø[(y¸mmGŒêVp…øÅ뤥6ôG¢Rë“÷³A¼òô^+ÂÒöÀdá‰Ð÷~BxzUÁ}ïou+ÈðNiò\.Å|Ì{·> ÷ïýå«c! {JûÕ2ˆÏå3ôÑjQºþ%säyÆYó¸¤0Îô„p4î¨s·¿g1r&߈¥ãi|N£Y‹¼´·Xbæ=×+UYœºð>áiãBÞbŒMSx ¦Hã,z•­ ,¹·ðç Ó¥®Ñ£1²dTƒ”#m›zk]Ç–;˜ws“A”ø˜»‰µeMXޤ ª[ "1kY­€„‡fÂëm¿Õ»Í,S V¸g¾¿æ9Ik‘³ÃÝÆ×5yºXór ¥Ý~žÅ•’Á¶Ü~2ÃÓxÆy‘úxÊ`å*2:¦a°Î^]b¾ª¡}›ªñ[áÙwMD†Ô}¨wp)|ÚÑåTz®(J@||…ãäA: Ç!Œ²ðRX¿`Ú …’¥#Þ8~7@¥ Æ; ŠŸ±Åjsߨýçp‡b©åeÂ®ó–Æ Ù‡Tûýø=TDسË|LÁ#-سe¬ß$Ã-ONSèÄ.¾k‹PŒa\r@bZ¯øw\ÔO4õ§ÞEOk!VÔYM5¢§ƒÃH¬"3Ij)í˜0¢n£G‰Œq½ÉÓ •œ.I*,o7®­ëþ§H¾aûοGeLIGöÌH´³&ƒŽ‹ÎÇnUmò…_¬÷%o2sGÅÔt‚´ÅêÊ •n<¨ 7¦qÖîÍMxâR©EŽjôÒ¾oø‘î·ægl!2šçUȱ^ÝË~•ßïÓ“‘ƒö9>½Öï]~U”{*/ÐÍ…¡Â—Å ‡úY“çIž5ÿQF^ú9Ѱ¯¢pÆgAƒ£9¿/W.ZCþ(*ƒ4‚Ó°µm-Ñe^¡@å\SðŠ4ÛG÷ê.µšI£ÀHšÒ…Ø„àÌÌûÉ:`h칓·ðdO–'L›ï³¸ò¥õéþå@m]±²Š~nö¬âhCšQ¨øíQ ,U‡oVnýo2”–®²  u¬ÊÕΠò%aªi) XÁôœýñ]bŸpúí¯<^{B`Ÿšmxî¡Â)G|ŠgK0-õußú~ðï8½S†Ìû·=¡IèÖÖ“\.šèÁ¹]|Š€ñ RГö³NŸcL‡å•§f¹+ùrPf u#¥Ù𮰹ęàB¹;V‘t®ÃÉ #‰tµÅ¹¢„¢ãʈÇ(¢Ù¥L·™tÞ«%°WW”>/䙚§/Ã_Ÿó$"æ@ÏÂ…2_àPÚ©Ñ–ÒiàÓH6hüÔ›oç‹iC²«Ø>qr&ú9ðz"%Õõumt÷ög_÷ vKíX©?ÛùCmíF,TYe{¥³«¶‹ûoþø#–¼{'&7z@ªµ†ñ`¼½oðOhÆëxÁF­p´¢cår/Ëú¼+¶.æê[¥ë÷Ÿrhª 9tëüòÁ«³ `®Íž6ÓRÚr»m†·p”uݤ]á'•í×\îQù†üXñ æ…E«¡šjê~òlŒo'ä¥Ûo‰-Óža1¡W ™˜j¾‚gUdÈbšÈÜÈ4ž/½ÄH3€[GGûœ÷x®Ø|ë"1 [)q7ž¹³g—×y¥QöpJMútÂcÌxö] •&4"ó…éeVº¼éû•óÛ,ñüÜ6&uwÕø.–R?|x—>a‹„ðd#µ®Yæ€ux—yóç©‚#°¨—ï}~•E?íÉ0ÅrƒObĦؑƒ@¯Éíª\p=®tä^K¤R¤Š.üjÖH3Ŷ>¿²r~î”Ã.ºÃZBç­yd£JêëdgÄ |!æªí ‰êØyŰ0¨¯Ñ˜[sØïY£Ò(;¥ƒ7dËvŠ5ØèȪ ­d<6¦Û™^Ã.‡Ù9ôLÏ>ÙÛïPè1/°n¸Ç[å2h–(µ´œtW­ì+Ð mcv%È¢HMTÇôæJÒ()Éÿ1ìœ Ímgnþ s·±ë´¿.ChC‹èã®s;H -b¾.”ó°ZI|] åMu™Ê¿…OBíïOù1‚ü0"OÞ e“b.ßžùJó“¶} QÞKv™‡¶†¿÷¥èš²w<%å¶™G-fô7,õ‰ÅÕ(_ɺóÊ’/D‘%3’Rö7zVŸ´äâ5U,z=\(š C/º?*õƩփ\âÍbº×úÎÞ bÚ¹m½âª3RMÛPPyu`R‰ÖàµügQVCY˜Ö‹-£Ï+­·Õ&K<ìêÿŸóçT=ˆcTZ Œ8·ÚêÞ‘‘´œBÓ>lå°_ž6Z¶j<ÚZ0WgX(¨—vØ—HÔìÓ½‡m¾çI×½—b¢”$²jÊÇ­? ¯×ðáe-vgƒkÞgæüø ªâ®°Ý¡°ÙE)"g&jÙ‘ÑRvò²-Š^¨f£J@0h"Ýaâ¶æ^½½ŸêÈ茬‚ËcKý#›$µa¯ÔcW£Uýhl߸òÓ­7ïÍ„' ­dƘ_‘¾N6€tÇ"<ÆéKiö?§Î?éašžA.ÊvÙ5^–. cl(erLEÎÇën»XþA®üvv̨²ýiQæà'*„ÿÔfñµ’à6dã›À†«"“®¤ÿF›-¶oÞ9ÓmŽoåþÌz—Ds—X.Û ˆ»¢RÓ®¢=ýã$›âlçœ6óÔ²æùÎÄ ˜éKݰ[Í`¯|´@+Äèœq·dU?-ü¾ÊI0³7FOD°S]mÀ*ƒêðÆà6'èƒbûÍUlXŠÕãkA&ht?c6õg‘²bÙPDc4dzkÕ…LO¯à¥Ïš‰—# o'ÖÔúT¦„¦¿âÎyËÐ. Ç$4Õ–Ák½œmÄÄ:˜ñÎw{_ëÕx7v”ÎZn#4Õv¸XÁêŠ^"Œ\’4SJnøù:N\#d]?Î7²Ï±A{žì¡X[]¸ „I«Šy2mj˜«n¨®wŠuÌ%Ž›­=×ÕJE$PÁ>7äÎDK]ù^è‰lÿvoÂ×?Rº$ :í?w£Wýð;}~¯;ýMxPB»Ž‹´žÔ¯Ôy†[ì^—zc¦_x×ÇÎhû8Øì®:R”"ÕŸï• ™óö-C>E–òù¬óS§*äö7nH{ñˆæ«>þ-´ ÝMJwH_YùVê™þ_êûбI·ß)0­“>Õä¥ß„Ïâ t“ûË.Pý†úÜÒ_ÇÔªÿûŸpèÅ–ÈJ¼œ!æk} ÓÞ^u,ž9¯á}´M"p,Î{‡_˜–)V… âR7: šÝXÔZgC£­5Óòˆ_zÏå’*Vy­tk*µ?´Wîé<“7PM¼fêl³¡l©•ÃĹêºk”¨ë;Œ’Í‘µ|+fýævP#³ãÖ:¸m1u¦Rö/¿pô¥úήï'nŒI^Ç­×…ñÏ[µ¤Xy'ÙbÌ·oœèj§ö÷Âq³ºÓºWÏL•œöÛ¬ÂOƒ Th="ÁjŠƒ/ù½–ð/ˆE‹°dX!ûé <1)E‚ãÎÂèâIÊP$Í´d…¦}_p˜ÎVÌÒcXloMìè"¿™¯³W;“…4ÿö> ²©fb߀Ý›±“¾±ï“Œº©o²sñB<#Ä(|UdöÁ^€áR¨"[uç“\XiÛÆFlAL_®¹‚lüP–¬Ó[H"QY¶ê/^ã úK´20Ò1Z`}RkÄ¢±eE«%&Uh¨å¹ÂÙ©EVé2pÝnïfÒÙ>·ÏqÊy:Çdë­ ISëÉ&fÂ8úEÑHÙ¦Tçˆè(‘Hµc”à`+©'dÖ\¤EìEi×=c˜D°¬ÌÇ©¡…ÎóNÀ G¥v¢ˆ_ŠÏW'ÇsÝøá@Ùjæ4¤J&@ Éô£nãiz2‚ìŽRtUηÜ[†ŠÕ’r9õÀÕtªÀD$cÎ&ì꼞Šå)”€þfZ}à^z#ÿIÚ¼úÑVÖi×KØAkDÏ/¹ÁìUKxÅñ$&â,èö Ô;zÍ^g¯SÑ-ò½.×!’›Ûh£§<ëå)R úCÀCá‡ÊÃ>í–*™á³4M}Mé7ÇñEDfúº6 #4RqMã6X–¯ý â´|€BÅX{¬AUj-0*£õ7"°¢ÚVí„é¼±è'Á°°õž¬º]ÇZý˜}¹bn§r¤×àœiÁ Ñ„G­¯h~³|`RÆü"—@ó˜Á©=òÂâ¡/ød2œ‘ÄYsLJCÊ–ñ™V,Bü{úuë‡xÊžÓŸÍÐÃR¨ïÍ-…Ö)ÝC…MùªwŠôgbèfIP{ó\ç÷l–¥Iâkiø¾Õ2ªÔA õ@|–ãöÑ$ÔYUfÝ~b¡•4=!ýé &Î/v› ó‹5obV[^>@Ÿp§ç€Ø÷CT71Æ…Ì?ûL$;•Ìöã‡Y~ZØ@Z¶VyÁÒÐY1SÂóç:ZÄÍmI·ð•„ô†ÏèQÉáIñ—ãñ$E%ôÞe·ÊêrŽð¦ŸÐ-£ï*ܾ?æü¨Š>£"g0dø}…ìÜ•ˆ`ˆ{9ä–}ø»>Ö–yÏ€jë9½ TÎÚúBfû`³‹µ¡Pñº‚ëÖã¦àB#?xbæn‘•ö¦^0×Í])ÙãÀUÃ2\8‰Îz™?quµè7Ÿq“È௒C;„#HÚ¯Û7­×•e¬±™G’/¿Qd¿üÁ¨÷œ)Á,¶Í:vݶuAL4©ÞöPÄ‘ç²æš}oîT êsÁ.Xü!Öϱ,|Hl./¢xµ¥&Þ&%çWü,oÚ›åè–éõÞZJlÄCû"|´“Kç8v»{¢þüѧ!Q×ê‚PeºQ”9BïŠó`¥Öiû-AQEríX?£bx}p6•Áü³˜žHNXi…™Ø6 =êN°D÷ìw­ Q|Õ¡¢ÕP¬{®Äã_?OönçúÊ`Ó­Å"N|‡p<¼’D–³º9¼Í¦^½ñý¬k°»XÀPÙHï¬÷À iG”‡RòÓtì¿¿ÉŽYɉQqOX)—K\ËQjÜÂ_ÕºfÙº:$râ*·ÿæìF;-µµ±×D‹®Mtª2hùÌÂB“É‘„ÀRªÍ¢ºŠAPV¡Ð6 ý ‚³–.%㩹ÏÞÑ[¢RÝ´­¡Û¤¹ÆTæn¯ÁKðSgP-B6ü<ÔŽa#Ì—Jx ˆ¥*qØ·¨Úß>•*ø*äÖlE$Äß )¡wÈÎê“ýÒ)‰™ˆJÞ §!·© x9ëÖ [#jöœøãÄx塱‹zã³ïžœê(Ѻ © nˆœüÆÕÂ<¶Ô_&õÔ ³4nÜT ç)–¼Â˜¢*ð9ì$|ãæ>W³5¼Ï™düA°¥+eõÇðe÷–/¯¬ÛO ¡:K˜Ö#@Aœu Ä“‚øâµ×<,ÒD*ŒJ(å ᤄϴ›©Ë²¢A¸äÓïO…á®߇O³×ˆÄЗÓ-~¦¬ó?^`'JŽq¬aø2dlp¢L’/ølmO½£ÕŽÄ7ßÓO¨r‹¨âÆ‘uĘ˪Û¦ž pãØd×@ã êòIâ⟧8F½æ“ÈP`— gصkoƉq0MÓŽ@Rm«Ù¸cN "ðÑl&†Ê?êœ?‘åp!Ç dÉ"ä›û ÊdÈ6àz*™a½Ñ7n•8Á¼’-ˆjÔò7óæVÄ«F±"m… nØÄá#ÖV"Õ<·\D jm ‘“?ÂvàË êïM%µoíÕZ‹˜d®2^×®i¡"_¬,éN»p²á‘°="/ˆaDs6¶Àõ4«¥ea…TÔ¤}xÞ]|´Ó£˜}]¡È—ímõETÅ€ûæüd½¯ÁËGZHé|L6À0E^¬€·„ϸ#ðù–¢ÜIyõEøê#q£ #×ñ»¤ÝXÚ[@} ï'a×NØ”……E8­¼ûpó*fdÇtÞáˆôƒp3Ao1÷¹=[ŽàÍ ‚»¸“´Û§[òÛ!ó̬9æàsûÉ4«jïɘ8‡&Ζ³–S1Í Q…AœoôÒ)Ã~=6 ¶â" óV£%±¬Ù-F¿ÍŠÊª)Ý-ÅÊýÖœÅÆà¼3­[1~ý£UÜx,ŒÓä;9βÌ_Ξh]’ÛÖPe5<óáp.ni ¿à€÷S¢yV!è1|ú ¸t§3ºTnyDW”ÎK¹¡mØ\ƒ«åréœ, “Pˆ]2À!i o~&WVJÜJäõt[b‰1«¡8x[g­ú¡ŽÁ3ºòNê÷5Á5äî “‘¦±+dS\VbÃÀc”â¼ æ}2SÙò,¾:$‘x!›©Ã»Ö±¼£íu66a¨•þ¥EŠužk-Ç»»Ä ^#‰„–VBÖÅ3¥Ø¢:׊–"WY üuQÓBŸÌh±f„ë$£2)„ðýºd—¯Ñr—)öú%£+b©Â”ìânÞô2„ìÙªž×»ÒF´t/)L<ëZzì;J7F]´\¡¬a…†‘UõZa­£Ue/Nd˜„uU‘K®ô~ hÙ¥rD"·‡ð4œ?WÓ´šõº_µßÊaŸÝP[![…¼)dëA b²2E º£•¤mÊ‘ àœÂvÞ0«¥u¬˜F—+·NüZD“pŸ)]Å%0°®ç÷ÛäWÅðìš#‘ضj{‚øßÈÁç~ê§g|Ëõט”}s,- å@) Û Í5:’ía(æ ‘JèRâëì逽<Ú2SùŸÒRÌø–µñU,âÌüÕ(éÎ,kß„>Fyîóïf+–¢ÇEoBàòFF@ðbùõÅ7oJ¤]âàc€Râ 6Ú±BE+ïì󵎕uBÚÄãXý½Ÿ‰VÝ{óÑR“¦Õø$2Âkö0%>Ī}½yÒË‚¸aõCuoʼnµÀ 4éÜEK,›+]¨ž€ñ>ÙRä<Ì‹ZØàm¸*6Œû˜¼Ð y†Ç”úH%>µÿëÓµ·$VÊa/öºDì›[°-faDÞ4þÆÙÂúÍ“RrºT„tJ‡üµû;‰É}ަ¼È/àu´kq´eÔ: ¡ž1¹ž¨êOZ¨î¶ Xó‰˜ÎÓÖh9‡{´HYX¹¦=g÷ÍÆ§ø²ºÔ˜,qŠn±ø%‚Y#¤‚ü‡š> Oh¡Ž±Ûg8VÒˆ©|?ʽvÕuЫøv@]®b«÷‡[±¨[í±Nv¼I‰³[ š±ã²wľ¶…ˆì‚´ ¼gÖ³Gl 6àLJv‡d‘´!ö#mQðX7¸Ý8¾²¨‹·’Ôr«´AžÓuIœG|n>°öÊRÿ­´!Åug´oÜ6[¤üff×8])¹›åP8{b9/€ ±oŠ•Bý||% hPæY?S‚øtE·†§\þòÕtœ[ðG+Få_Úž>0¦¬l‚ÃìºÏ¸é‹ ‹ªE¿¯­b>ÔØmZ0G:b]F¶±W×µoïE8‹@@¢ü>|û¥ì›ŽüS\€¨ð @;÷g¨r ë~ÕÌRêšçËJ;±ÑEëa(žb !É=ŽšõÙ÷€IˆÔáyZØé”Ù¢ q fØŒÉöS-jë¤P Ñæöd´úÅÿ%¨g•â;dyÐÆöÒwýžýºÖ“ÝgðK4uî!7gjÑ; hú¬Py¿^%DM]õe=Yx"¢DÆÙÀU‹üœRC_þÔB@ e‹ È1ËÓCÚE‰‡Té§’7ø•XTëW¾x{¿É¨ð),MµÐ¾=~Å,Á[³_L¦ªJpUÉ ‰ù2’q¥—Õ×TØåéXœð ?Yß-—¿à뽸ÒcOÁ~¸"TJX ®ööEîûS*ál䡱úêüàÐä)ä7ÇäW~Ej0ìœý.j‹@áH‚è7–F"HøÐ-c –¾¶iÈk2ýFT×k$'cò€-–3D_cCy ™Ð· 2á‰ÛŸ­¸³‚ÈStøØ¢úËx(%J¥W²i@r‹z {H:z2æ,òჇÉç.½íÃbqyˆ×m_;‡åëº4æ¶?ÐUu‚ \ÜgâkÆæÞû—Pdßk|ÏoI˜Jø^a±]s,ß“òKßrT"¹¼Ú›>¬É‚BçSçѬÇg¿Läñã™ß¦ˆm R·˜×®„ƒ¨(–‚ &ù\iÚÈVt’ÊKЇô +o‡ 3L¹¨_Ì^œ3úš'hßõDzØrÍ3eeRñl‚¾‰Y9n>tÕçNœ9 PŽæÏ&pgb?›V‡íŸs½ÓØ}æ2œ”×Yï£vÊÌæ¿ÞvOМ¤ì¿Ô—­§GÀò/svh™/ém*)?c1öWÊöú7ÅmA÷S£åk`Žñjœ±•V€RÆ…N° ]Y@y*ì QŸÜ7Á[óØ& !¿Ô"×¢éu2µÔ¥ƒ½lW&*¡~ešœÔ¥à¨Où`|U™I°ÔŽßdTÙÖvëW¢BaP¼›Å]Fψn¶–þ"uÝçà†„3G'Òå)98ø){øk¡ØÚ&¼æi;ªÚƒ4bˆù×¾R ªºôC—[ Œޗܘa¬å†3†1ªÝi<ÉÇ,£ÉŸõ«Ó£tS·RMÒ–»v‹×&ÁÇÇ{Dr^õœÇØDú­Gõæ`þÐì•Ò[Ì(¤3(q7E«IbÊ{Dx§ý[=ú”»jŸúû`¬ÉQNâ ËÚ™Zùésú›û°êfgK]aÄ&Î[@©0÷:NJnD¶©§*„]Ô#f⚸‰_d?˳YŠÛ¹¿­JõÓ;<žg@¼ ùT°O/×=Aûc:sG×ðA­¥¾k›k§â–3G&¯šú0y¬ò]‘Ø/BÑ„êgßÍV^IQ†²¥y!¹Diú«ß÷ÅÛ T›µG˜Ë–rf1›YJ Ûš{$D­ÑªA*SØ?ÓÎ…»Q ãm+)Oï‚l®§w-,41áC:YSÌ 7Ü­ªhæ[ÝÃ=–Ú§UÁ•+Äž¢ÀÎYiõ× <ºF"e²Yg$ß•húAÿ†Ä`“&Égß{CŸDêtÚé8ÈÖ‹Òaßy³W’ϹD˜?lÀvcV8mFv=¿‘™¹MCÿMùºãÎ{~±ÿeûmKQÖÝPåçóWÑbö—¸x®¡Å|°­ðÒï<9A–)Þ6§‰¬y«Òñé R/#ªbòø¤GAÍA5~k¿ýß`À÷4õá†B›H…m:¤“O…›~:wÈ9Û÷Hâí“á‰Æ¾} ( ›£²9Çð‚±¸‰·îŽþ"¹[Î{k™Lˆñ ẇVA–p¦Æ³ï§T¦äâ,ó’WBÂ¯Ž¹+á “…ݧt÷8” è@‚hb¦ åµÌÎ!¥³¬.LŠ®(äg°ˆGÎ!¹ ›û±¸ „¨—¨°<‘7‹ÌU/#vª !… !\˜—þ6Ðh¢ ߸÷dÇ5à„¨jΧ‹9…²q»®1Ö-S.î5¿æØh/ÎÙIw®Sá›ÊPwV€©üBjù› fèÕ'‹upç½â1™Ñ+¿I xP N0o¹£Àª¦&JŠÄZ„°Ô·Ð_d’ Ze]@cݱ¸Çi³ ÌæÉ™Mnß²ËJ½ÚBm?­åÛ§NyãøHQ íF ïùæHvƒÝŽ]“é!¶Ï÷â”|ñJP_ ˆ€µÉ'nšTß‘Ž17‹¶ç5M”x‘üHµ! µ<í2ß]'í*°ši7Ôsƒýq,IÌžfê•v~¿’ƇÝzŠK“_€Õ6—$ê2R&v‚¡ø{¸×£n¯yÑ×ö@@€Pö½1C\Ö"ÂN½n)L’CLtT&~L;Cí°Çàc ’8¶S4~qt}'ùܱtýh€æfU:•á—õ`£Ï@•FùS5«CAר¼‘¡€¦N[€Á'˜+vcfËãö~:ßéWÆ®&v:fÿ­Ò|å%•gˆÁü\ÒÝæÞ+Z¸Ó ¯u½ó”îjH¥œÌ²Kcm Œ[ÕI^á/…‘È áp~ÏpË"=c&­¶¤Ë2ÒÅ;\š1†`;lÔ{Û»è‹Ü™7ÑÛE^>À'ØÔ‹ß#÷ èL1ëÖÆ´Ù¾NÝ`âeR» {ØRÙqæ³bú„ç'Ĥû#¨Žž¬½)†¹ZPö¥Ç‹,;60 V~ÚúÏ8Üeà0A³èO.-x:ÃöÉŽûçÑÓÉ3`¹¹‹ýEâ$&íWët Æ¾ Yù[¸Œ|å9Šä'/Ù^?ËõÌÄ;Y›èüXN®,çÕøú= ï÷.¨ìó3w3ÆÍ=‹‡g}\œîµüˆBžëU¾ ðÓÂ0≸Œýƒµa6ñ‚ÒÎÓçú‹…¾Ó )r}¹Š(öu3çÏi‹]K²h‹ÃŸ¸z8[šA÷ÙÍ¢…ï{È 7f}ùݦJ¥]Ó«“vùλòtXù¨êù½ßÖCƒ?i‹E˜¡Z²¯UWHåE+YÖ¶aFšNÀwb…íÉjþÐe¬ µ£(=¥J= 6l¨çŒÍŠ#òÕÙ“ìHà®,;IÀ(xð¶Jáä=ÇÐÇyqNòzÑ©#^uåþA¹×³«fÆ&1™i u×gㇼ ¥k½…ŒæW“;L©´T£>šq ˜XÁëWtο=‘'$ПÌ_Îri¾*4Û.`ï„•Q®-Z#›ÏrÇÖ4=ÄXºžå'd΀°Ù#*Z{rûD“[‚§Ç¸EâRÀw~w_ù€ CE:u;˜ýhÿú–AÍ;^v£MÙùóÂsª­ú`H÷÷ÁË õïçØÉÂK¤4çÄì‹ ±K¡ÕL$õ‹D )¯Y¨²É„åÈžÃjé‡*Gÿ —ì’—L)C`q^Ãf'ÍÅNžÜq%·Yµ!ÒŸãéŒÏìr¸H¹i÷d³7L³¨½sÛ1TMøÌy.è*ß­2[²5ïú°˜d†‚i¥I;¾ df ª[Õ®ÖõTp…9":ÒÞ¶CRáDg„YtÔ±_)X‹s †‘¾I«×Kò¹|’ÍoÄuc§ùõ,9( ӳ͕ªIdÜKÁ(t’:¬Í'd#I~6áŠ5æÌ­º0¯mS8Êêp½¹°ìB%× ð¡›Ò€ÏUàŒ¿®íßîr ªõ ±C†¾…œ:*Ù’²žÜÑspóuÜL}ã–ŸÍ»AÁÖ.öŽyV#~uÛÊJKKØq…›¡¾Ô²øÍ Û"ñ3¡ç–Ÿå$>[ÏÅ$³Å·w…`•i7bHÇ~3ܯ¿öM^}í.¥%À±xHÁw½<L£¸Bi:–O¨"–xãÕ/º ô^•êzG_/õ—_å w¡ß‚ŠôšÒ,±¹ù·þj<¡ÏO×W?¼ÛQf2 [;Œù5 íÜ‚ÉΛ³ŽÄ“7‡O[ ¥+­å‹È9MÛ?û&¦%I´q~ÈN)L4—)ŽÑ`À„ø|ÙWtV¾ù„Þ*m ž¤A]<%wØ“9‘ýåX‚‰Iêÿ]ˆÂ$Ž%ûódž ò÷ŸYÏ5ê˜òb‹IG)Cc‰ŠÑºn>ö¶•SÑ;@x—­=gùBÑÊù k#FOޤS* çb?ªùL˜„_iu‰ «DNä[½× Õ±$Bs£? ¢¨ÃÌ\ÔwÚ¼ ¢aß\ц(Ì‚3öÒèKÝmPqDùÀi\¸ðGòÔnG /îÅ\úçÀnGA!DìžžÓŒêΗUzM¼2¶Ì˜+Q³‡’]µj>vš }°dßQI¤>’­‰ßÙZÕ‡Ëo9'#·gT`‡–z # ·ñܸ ^ ^7<«ú¹­gëSŒ?ÎÑüÄ[~Òù5çjÀ›_‰‚cAÄ ào0åW6àñZÊÛ¤F1•`?¯¦É 8I?ßQ”qŒ¸ÆfýBŠßÓô%ÊjÞ£±lÕêa®ž„,Qv¿8•T &moÍO“4Ú1ÜO @†ÜØ·/7YKò0ãU€*rª^5_ËKá}”kq 'Œ„¤‡|ænÅÏa½ÖÝH5+/«ƃ¿’ñ¶fYGü†Á&€ÉÕUbÎ@lÎM¼!k¼aŽ’ÝÀ–) Dϯ¾ä¦³˜þM>­·i\`¥!=*o¨Q#8€…®AÕ†MÒ}%LÄðÍYfPðqv“f¡Éª|ÚiîNäõÆèm =@,ž“ÝŠíUÈÓæ«ÅUÌp÷,Þ¸Íkqp´É“þp€T¼UB÷•ßvÞü¾ß±¨ö¬óû`S÷tÀð¤ô°´ýX´ÉÍs°À9(Þ&Ák¢8×=n„>Ñ*qªzaê³GìJMG ©Þõ—ûOã!Ân[ø0±ÇÆ/±uÁ úã]]¼‰ûxèŸ?[âÆ;Ç?¥kœÈhÞzÞuóG–%+ª][ª$/{_PŒè]h'FܲVôLÄLQC´yª!âßšÒqL_7”šÌßÔ„„„òè…Ò_e‹u=Ó:ø¸3¨†&óµê¿†¹=c9B†IŒ¶/.“`Øè„ö{Ü×åy#›å~¥ Øü@²è˜gçÂ$UcT­Cáß?d‰÷2©¶<þ§‰À©oÌÐb‹rQžâô»-Œ#ÊŒø$49˜fÇÃRîëÉ9¡þRnÙ¯¬våÕ³Ç_(Y§"¬Òöº¾_6Ò˜ñuùhÖnŸ5Ô1,Tü&ѥLvßû|ìv=°¤ÿÂÍþ}YM¼¶aDLŸJiÚ+âüÈ‚E{aEŠl+ ÝÔžù À„÷ú†Ñ¤¦Ûf~ÚŽÑú â)Mqö/ÕÔüàD¬6¿¾‘yòâDº®‚LÈ_šLÜÔ»?'kâùئã-åF_2BÖÌœÎOXi;»ÇÈQ‚b·—¤É·kV‡e. Û5T™Ý g|„™^ÏÓ?ç>KÀâö¤ $ò(òtho¨aó5ÝÐ^ 2Q×v$/so䋬w™ìM<‚å<Òàv¬e,&õšð.œ„a[sÅ_%çììó‡5ôbr%àšȱ+K3JNžUOÛ—~²O"Õþ–Dp\CIZ­wvÁu¥Å¾áp=š+ÒÌIwd]êú}Ÿ ”×ÝMã¦$7~~%LjÃsÛÉ}½iù‘"o²É IBIóap]|: $.!ZëŒKO]Â¥ 3ôÓVã¶~lí‡ýâÏʵ¶[3¹O°o©iH™ç*Œí…CÛn³».àä1…@TÅ]¿:¦"Ê<'ÎåØ×kç ú¤!Xáùâöñû‰Ê!·Q[ðê¯hÝSØ †^~ŽÒŒœË š_QÊüÞ+\öi":«½Uš<Ç6ñ&éN‘ÆQ¼Êþƒí™¿ ZçÉ®[NÐ¦Ö ÌNpMþxŸŒëƒ²¿J,ˆZ©XZÙ[7Án4spÇ^IÁ·t~ØöÆü ÂmDêý,øhzÏGzo:¯¹¯Y¤ä¦GQá‚rcn2?÷ž!‘ÆJב–:åø`W;4‡ŒnY™ej´žŸ…o¥©@ÞS\*Œ}`Èi9j¦í×ì˜?’·²ÉŽKÐØXÿGºãßÎ=›€À“{6¤cÕˆ‘¹;¨->bhËOC°lo…rG<]xöϳ+Ä5pq8 ã¢ñKâ»V¿QÚ ‹q+1YD>Os‚V¢N ºtúŒ9P“…¬îש €Sz:v2¨b&’ Ú;³éTF«¶<Ä}狹…H,Á êwÉ ~2á¯ÑÍ@"<ìÛÄ;cÞ´†\B&f˜FËiÎ%c~´º¶Ð¤×¬m(]ßjñÚ ûƒOwΔLòùZÓ òGƒÐY·tÖ©‘OÿDåýÏǘ@'ìù¥Â¥NkÌq Ö7b`g²W½S@…¬×s•ø×9µ|”Ñ”Ü[ev+ŠÑW^×i£©¡>ER›åÁŽ"*YÖ›«ö…¦4CŸX •¶NN¢¤¨W ™@•0:©°ZûþâõœžmÔ'…SûôåØP_8<ÂÐYäQ_G äT¥â¥"N c*/X¥çjqLjEœvúg×("´/[p™º©fŸ\TP¾Kâ ~5ÒžŸ²ð-¥•P̯V,Ó§ư`#½Á¤ÆNÛàac;Jõhô™XˆbnáÙžŽ +åaÁÛ¹‘ sÛöˆ}ìÒݬ<œ ìZK…;kmà_4–Ú½³_» À]$|m gÍŒ c7Gß¿J‰O­Ú& T? æãæöþÜVä‘<ïÖÑ^®"ÄÔÂûç`¤Ð„´©¹q}‹YŒlØ3¥ÃoE/{z´ÍRÓyọ́š§;¡võ%ÊŸf‘§QgJ™vãM@»ê¬0c°r’Þ¯² îWüÉúÂVZæçõ–…­9 ‚zÅ7V¤Œ›Ä\Þé®Ê)cJax µ{øÜàÒvÿ)y:sÜ?Ë„dU³ÊÎh÷aïLš%éÈJŠAG Ò’NeVj=aߤ<²òHn}Í4Bïù5PP‹>3ÎwºiûQ(WŽ-8vÀ-üåÊ]è•d‹ §6[<îú¨ŠOë 1Ì€zi¨ñûk~ˆþc­p™³òXˆ éWh‘ï{ÒÑG;éJù Ф.¶” 4å9Æ6ÁY8É÷‡¬ endstream endobj 530 0 obj << /Length1 1839 /Length2 13191 /Length3 0 /Length 14334 /Filter /FlateDecode >> stream xÚ÷PœÛò‡ ÷à`€àîîî–à3¸»»»; îîî\‚»»ûeË9{Ÿÿ÷UÝ[SżOw¯þ­~W÷š‚ŒXQ™Nh¥·²´§c¢gäˆÈ)Ë21Yè™áÉÈTLìÍAÿ±Ã“©‚líL¬,¹ÿ!b Ò³·‰êÙ¿ÊYY¤ÌL,&vn&nFF3##×­l¹¢zŽ&@€=@ÚÊdO&beíbkbdlÿ®óŸG¥€‰‹‹ƒöÏå! ­‰ž%@NÏÞdñ®h gP¶20Ù»üO J^c{{kn'''z= ;z+[#~*Z€“‰½1@ d²u” ׳ý]=<@ÅØÄî/‡²•¡½“ž-ðn071YÚ½/q°‚lïêe)Y€‚5Èò¯`Ù¿h¿=ÓÓý½úD&–.Ö30°²°Ö³t1±4š˜ƒ â²ôöÎö´=KàzævVïëõõLÌõôßþܺ@\è @ï½Â¿ë³3°5±¶·£·31ÿ£F†?Ò¼¿f1K ˆ•…ÈÒÞþý‰šØ‚ Þß» Ã߇kfiådéö24±þQÐÁšá«¥‰HJôï˜wü?6#=€‘‘‘ƒ‹²€œ ŒþPq±ýédúÃü^ƒ‡›µ•5Àð½ ‡‰!èý ÞÍNϰ·uy¸ýÛñ¿ÏÄšØôAF&–ðÿd7ƒ ÿâ÷ó·5q|c|o?&ãŸÿ>i½wÐÊÒÜåŸð?˜AVLSHJ’æï’ÿë¶r¸Ñ±3è˜ÙLLÌ,Ž÷ÿÍ£¨gò÷>þµVÊÒÐ Àõ×vßßÓ¶ìøwPþ= T€ÿÍ%oõÞ¹ å?þ‘ÑàýÓÿçvÿsÉÿ¿.ÿ#Ëÿk£ÿ߉;˜›ÿé§ü+àÿǯgabîòwÄ{ç:Ø¿OœÕû,XþßP5Ð_£+š8Xü_¯”½Þû4Y½w4=+û_f;qgPÑÄÞÀø¯¦ùËþõq37±)ZÙ™üqÁè˜ÿï}Æ ÌÞ/»÷ÎüÓz¡ÿ•³4°þ1kÌlì=[[=ø÷£~'6€ÓûPAÎö2€ÞÒÊþ} à½D€¡•-üçÊÎ`úÃôqDþ!Nƒè?Ä`û/q0Äÿ!&ƒÄ?Ä `ü‡X Rÿû{»þCïzrÿлžü?ô®§ð_â|×Sü‡Þ”þ¡wåˆÀ ò½×÷õzWWý‡ÞõÔÿKLïSÆú¾kþƒÉ¿¼ïšFÿÂw™{ß3›ÿ ßK±øßg”Áò¿Èúî|ÿ¡ø—û]Êú_ø^í¿ð]Éî_ø^‘ýñ½Kì¬þäÿi[Û÷+óÏq~ï¡ÿðŸ÷3ä 2€_œ³2àñ7­öo½¯Âw¢ÛgfEê¿ ½†UÛÃuÜûâ+ÂûpÅ’¶ Ô9³ö°ŽvÄ\øÖ`¦ŽÅh¦½æžƵXÛ e¨¿Eë>Æ÷xd'ëÀ¼+ÓÑ¡©Ëb 4Â:kTtºœ¦Â¦µ¹Ø™M?à%o,¿+3>ƒ¡¨?¦GƒÁáädA÷oJo+®šži—úlw)8~G ~ðÒ7Â̶Ùÿ»˜Ìd#ÿðÉZæ:ý?y¿›OFw0M¶Ý-†óMé{ÝêïC©o7ª,@Ê“!µ=q)yyš¡^‹ò6ô K‹‚PËE¡m9×¢® ƒÑɲ-×#gvv‡9 ÉÚd¡¤; «pûU£9\p…Ûô øÊ^«ÂeᬹW[ó«_…šoýÔR©âøÔ¸\Y¡IR(ÃR@ÓBºoÙPÑ÷£&Ë«èò[@[ÕgÎs-‚·.óTX/$“z¼ŸH)òõ H¨,àŸ ÂÅû¯ ©$ˆ»FlU¾fç\êk´:éÖ~¡€&¿Õ6A“;#¡õö{¶øê4LÚÎÅ;XÙ˜3ô õšTëW6ƒå¬/™*½u#nõƒÔh¾s×:i8xvßâ*59G:ÜŸ.Sl\©Î€„² wü…»Ó³îŠÛ9åöd9BS•q|šÍYŽÂ¾”è{± N5[#±ùpXç}¸Y•ÍÌëì¦2=¼¸y_l…¦Î𨤈G!Ë̪SSQüàr6 W‰2ÛžùÁ—oh%€áØz°b†*7ü;5ûÄ0û,Á³ÃËK«ˆ{*Ò—LöŽine{}Ô0WÜÓ®+'eo„/À· —>¬iñðçï¶ié7 ?Eç«ä Þ‡1MÌo+TÝ´diQi ÓIû‘/JƇ{íEòMÊýçÓøH§ð èÓãJ‘}u}Ýž¢A0³Ä¨=¸ÚHf¨ó·å@þæ|®§¨B'JJù/aöÑð¢æo­hÐÒíxÛ>™;Jož8®âN‚uoÚ‹©:qB¿w[‹¤ñ‚äq„è6Bø˜ŸYµqÚ4\Øõ3å¥ûáU‚µÙ_”³8³|"°¢TÂJ&àøí¬ÃáÔŠéâŽ&¢9¯2ýPÎì°Boç°Ã{Å´¢œä_Lûí¾‰4Aξ <ÀoçYV@ˆc kʇ Eóó3`)§­È†ΆƒËˆ9CRPëW4S¦áMhRlgU2€³ )â§Š?‚ Å—N-ë3q´Dcg"ºô¾H´nŽÂ"®²½RŠ‘§u7tlÍ„ûÕYó@¿ýóƒ4I­º¤‚NCRwc²r‹Á ;X÷~ ¬úQOÍ÷üZ'ò6ä¡çV[÷•Ikx­6H9Kã)B(ž\¹ÀmŠdçØÛœ™ÚôwW›±Xô;¾G7¯õ@nÛ|Ó7“WѸà § <73¿"ø¸ª.´¢6žíwÈ4 ³À4tb2¼Q¼"P\ÞE}^S>g²¸qØ åâ…€ºTè à ъ~ô}â ÇÂdPk1%·Â.Í„¾z÷ÿÍÕÔvT4ÅDŠMÖ€\‘%=cs8}› {(ahÐvJsDÛòiºý ½ë¹àÇGÉîç«\ˆƒ.S…ÔYG]º0"áeJ‰3³)> å8Ьâ.­UÛZ£6͆Wç<ÊQ§¹å\•Ï…ßDæñ¥ÕŽ]Æ©&&éÉN/\÷ î á\N"\È™Ò ú Ƽ9Y¥f® |_©¬Þ]u¶Wò-Ž·# ÒÎr)õ ¦>ýÅÅ‹S$¤F¤®&Ñ;V÷¢¥ÎÃÔ/Õö:ŠI¯ê8W® 3ÖÔ§ÉïO“¸,9'%ÄHÒ|j_ìíö¬àlqC]V—¨£[µIŒ±ùÏëÈÏ!4OV„&u•¦¸vNYÓ/ÊétÓçé&O]ÕNtÊ¿ia(šL6,ó¾AxVa—DéU‰Ä›ŽçEø„:•â‘6ÓY1}ü]ª_Eap÷?ê$â­~~K;}ÑçÆ =_<9e%ê´þ”Þ¨8â[J“«T„Zr$ÏA«î¡Q(´·v“õ ¦m"D=+ôËëÕ /Ý_¼­mc÷(I‘n™dÏH&¥µ±”O˜7‰æ‘´\êa•׆÷ôSÞç7…Ó«?:­ÝSä!f#ŠÉ!ä!|²©°&ŽŒ&¢æ LݹÍgLðd0 üÞf…Zë_Ñ_#fSCô· ìæ©^—Ò™`xÜá¥ÎÍUè?ŠF[tÇÁ-kŹõ‰–à~§‰f±ù’þ³ÿ<<Ͷeg*2™#¤ Ò½›ÑùˆhaÁj¥œz¬i²„žK-óC‘G¶š3]fz¾1c‡ºzQ±ûçâlþ†#ÎÃ¥"‚ž`‹ Ê§ˆ@gH”MIŸÍ¹DëmÔqËÛ=gÅ€³ ‡Iך×bƒr¹ˆ[³YÚQXã½ÕM`#\¾‡‹˜, —nhð†—@¾VIðx©˜‹Uó`› öÓ’ ‚0P£±ÁÁůïå2wG«Wþ»¿¦­IëØQ#©JZñ‡¹û€šqÊèú½*ÎÔ<óžù–¬ª÷üum7’ÒåÈKåYk©¿;Çç.R êϺ¿Ôo÷AcA™(óMªi¼”Íþ‚î\ñ¹“kÉÁd«ð¶È éõv9ÜaBQË.ƒ©9ŒòܦV8^jÝãÕ_IŸï'¸+§g›Èš>‘:Vupô‹bßf+ø³Ó˜¶V/Ï‹ ¿$ŽÝ_xV Mn|ŠÔè÷ÚñƒRÌXRŽæ‘Wµ¶f^ªv.ŸN§2×®»+öX^õ"vâ¿-§‡2[ŸÐ°r1goó¶?f‘Ej6{60|J€ÚÆÉ ÝX@NvŠ%×lˆä‡Ka€õöó¸¶aÁ¼wÅÔIEÀAj§Íšþ°Á³?n}Á²?63~n‡K±Î>~`€êsâ¢×°ãÕÏuÜÜÎ^EnPwäº"ŸÓÕAlɈsè—Ö½@ûB‘$Tçí ‡Øâyö=¶ËB8Ö ‚Ûôã ½"¢£ö’^m§~h÷<á$,t1ìKÃ]ÚQÑÆ'lÛÁ­UæØpù¡ÞY\vïœÊÌÈÎè  >iŒŒÀè‰ùõ()–8ââJŒ‹–ƒVV/wÇ\7Z~ñÓ)tŽæŽp¬sXø¼Ö÷¼ëoYs¶¾w·Ï`´ ”«‡-Äò™k¶`£?ï;wËP7¯‹‹áñxŸ‚Ê8+”R;ÔA{â2Þˆr£üsÇGãiv=Þ Wg3ðJücXïâ¾)ÆÚbÙl¸yt¢þD™*ë)ŠkäÕ¾åi‚pco @›aØCs<Â~1޹'!PŸÙ(ÿF\êL(}_E±P“jU‚I‘‚ý\sý6Ý)ô¦Z_ˆÆ“å[ï Ó,cï’`<¾%ÏÏr3|Ì™äôu:ûbcÃvô«VšO±Þê3¸ pE¤Ùë~ÆŽ/»îQÉqxôÕYË`½1ûnæ¦ ¸¡j.+žÐÁ8³Ã5–žš ¬˜%åWÞ`U"ñ:™K•ƒs$öõ~±°õÙH™dÀ£†´ëQüI¡ÀÏ ¡»Ð¢C2¿ðCì!Û—„ w÷Åœ‡ú=_æØÖÓËÔÙ"=/õß>дާ]—ïžµLTB΃‰I‘ƒ±¢í¡©DC¼“™“‚ªÛõ4r¹oœ×Ek6ØZQ(q+¸fÛ¤¸ë~­Á4)/³/œ® ~œëÂ2ºœ{ÅÙqAÒ‰’é|ÓúcX&Si§øû ÔBèÔš¤n³V nP¥ÈSý:jáúY2Ê3Óƒˆtža}Lò®Š †tîà£êo½ЅcÂ9r“±)wÚÇõÂ\sqÂW\?íÍ-Ê€ø´ûTB´±¡tÿhéÓSe_ô—'$Ä$ö@Çe’!IR¾¹Žê¥ä8\õÌdŒcŽ9_÷ã·{Ú’Q<ÚìRé¶nŠÉöí…L^'¢=òù!J5³Ù÷ˆ˜ÙâN6U4ÅuÒ¿zd0°è/)x!ä›güJ"©ÆL¹{sÂzD§qs)¦Wг@­èp>›h†Æ·ÔžX@/G^P§EV¸cžÃy;JÞ£Ø&”]ó;®¦éâRppÎË 4¥ßÃò¸*w³2û¹quÌã8páØ…Ë›Rbé[†ý’6œn_›Ç¼?•ï]¹ k];>–7÷áöRRŒív{ ”X㊬Ÿå›Â¢/i4ÌçqIWJî-uç´÷û“(°‹·<ë-™'ƒ²zÔÊ£ò£Lõ«mˆÌ„'?2;ÍÃ7Ù×û?Gûç Æ†¾œûŽÄcŽððyiMžá÷,[Ji<¥3)e¹weÕ7 ùý3dO_èÒµ.ç se©k£·NN¤H± ù¦®Ã—ù.#*A-2@e!MXj‘ß–ù±ÕxÜ\³Å—®=po¶GóLÃɬîv˜1uR0¿’2ÌM¡¼Fh4'yr ŠÍéB¬v=-Þ’®ãY|­ªr½`’lK0ÙÍVýß*–ÚÖ]\õåÎç]0·ô¤_[²}ÌÒ ~AñWM*ÄrÆøžP!ô›j kLmD»dÑ9lA”¹©Eãl¢ÕBû@O² W¯ÅÿƒÐ¢Õ&¨œ9ÑSЏ|‘ή»Ÿ m¼j 'µ{´u/nV&Ò=O‹I RºKϘú'Í´»Û³ýj’àœYÐë­á™âÀ÷©‡£Øò+aw+l´¹SJp3„oË ¨ ö Þo $Á$9m顊eûxÄÙZ‘‡ÔÛ­Có3Úï 5sNUþ´ì:³Þ»)NÖŸMœë¥ôQa_|5´2cÊD~a/a§vm"Þm«þä¡@Ë)âö†!sáàbsÿP¦.…°=]÷ãt±#˜®w½ÿ^($,ÚqŒÎÕ‰ÿ+k½ÌI!¨)ãNÇ&Ò¾¦m>Ç„à¬Å!¾@ïDï°Ô /ÎbÚMåA-bÛùà°VÌ>˜ø@«ê1Ȉ‰mÃÀ^o¤à©îV¼@€^©36Å«EìÝï7uot÷*—UëçóÈ‚ù2ˆJeØ!R>(—Ã×öô[ž1wÑ–lx]åâåõ蹕"ˆItTFsúÞdQ<‘MåCv.©®°­xÞælY/w诶¶¸½T5Ê4¬ô†-îÝû2ŸæY%>hƒFb‡º"'àÕËÃ]FhŸÔ„“i7ã>ÉßÝßÊÒÌkŸ7ÖPS²Ä•cZ/Åñë uÇmÁ‰§]Î }ô-ˆ{‡¶|S®$Ïmxø·áÚ!IÙåK·<îG^t_MëW‚Þ·äó@¤J±úëNÄ·\D¦ ]V2ö*ã5bë¾M¯ÌÍŒªØ± ȳ é%jÝÕIì߉h “;_«TUµ\wRXbÎq®,RÊt1\¯¸;pT®4C Œ²´·-•X8›¢Æv\ˆQQcsæ ͯü ò?dB¡ØÚÉáQâ!—<µcEsœ®oúOr„©£ê^)âÚ}·wæ æøý[â åXG˜Hk :ËïG:)OJ &j§’ñéâä¸i-Åþ­i6¤›þ³w†Ö°3ä3ŽCÎxâêÎM_¯Eúra¥IÓã˜øØZùÔ^ÁŽêŒR±Vaî9ñ„Ðc¾ÅÏqþ\ŠtåûÞã0¯r¢ök×k>í䆞Q.æ ~îÇÌ6‘®Œ¯a|èx÷¥,ö™ H‚¸“–fM!ŘcЊ:à ¾K'£ßëÍ(÷gi?0~:¡Äú'of¿œ^>3I|~ÒuA~>~Á›Ä„¶Î‹KÞ£[›‰:¢›5Óã¨]¹:åú™;ø…|’¥£‡N^}â7V³ :ÿ?ôj+ 6Ü)Ùˆvñ—i+úÜhÇú–¸! ôIþ˜“å"<ô )™'»°—ðéÝË#.Âk¿1vl »ô7Ú+!gÐÛNAë¤{qŸšš¸×¼Å#ªêçÜ+ÍfÔÑF>ÖÃûd™o£BbºJ+ m[©—9¤ü'TÚ.´h‡¡ã2ÛÕqã!ŽßE8I©ÜûbùdåñJγn2O5)yWl‹’:ý€g“Cò9œ‚H6,–¬DÈ h¦†ˆ Ã-Ð1eÚòRÅ4e›H«yCþ®Y¾1“%¾ñ_ñ8 V<Ñ« ä'±ŒC9¬PÍS.±v ·}O;¿Ëãå~L?ï·…\(; ¢îöÁ-«lÁÉŒ€uVß5åËñœùÑŸQÖ8=¡4†±™Þòù6ïÓm²­L¤ò}€!©tÍÉ}°ÑáÉ;¸ HjÖ”ái3év}O†(¹XUgïæÙê:¦Û°Ï†Àjq­bD`ëŸh1kƒ]ǸAwçÏCÕºCï3 jQ’Í,½ÑIi@g·c;ó)"9™ß.„¯ºÃ½Èeƒê`âdž‚EY¬{±qˆmMÒyÝ]U¾†®H^q¢~S;çÛúå gj2… ž ½Ýckª–+Ì3"þ~zð;ebá}ù²ÔA¾]'ÙªàkÎIÞ܉%_)"õý3Vc=9ü¤pðŒFëÃ7º¨çcñhu¡¤ ÅÈp9º-ªÜë¾£‰MÖ° Ywi˜ÕÍı¯e(4â÷9,˜·iÚž€ Ž8ÄTœ¹âÊö‰¹ …f4…Ê)_{f%Š6BýÝÁí4|H\Z®äð'ð|Hh;•3WiÿŸÎlØS6;tGºLí.Sõˆ#C¬’¥É‡ÕrT™–, n/y³sÖŠQJ_ pK;™{Ä{1ÝÜîr õÚýŠéêWƒØë„ŽùßZüºò¶×7±ÊNÖjýÙ~ÛºæV)*>ãm`Bûm»%?Ú™9°hªù Á\.}å„]…èד ÒüÀ?³£¨4tÀ˜êDq¬‡÷ò¡à¡‡"°÷º´§´å"2pÏ6] X¦Õý ú¤óIxÔ³ .úÙtFåׄ…›&|ŽÝáFú,ô‡j¢å Êh–ÚÇú™Ù¡dí—æò”•éú×}ϧ^qúéú,¹Ë)#äèÛ]žT°D*î–†!®R;%ˆÏ]e9 Ëœnêò"Ùi¯mÆj&|š7PÞäÀ}õ”©ÌDO‚"±ÛÒ+lZOYhðI>TMÁ£qâ.½é†¢ÐÍJ‰‚{Ûj=À튷똬õrÒöÅV±ÑTê× a…õXk=Ò$G‘;ìÓ0¨FdˆÐ¨åU´OÌ*A 6OFZê3&ñé:@£O©‘ྩ³ùmsX͘>älÄ9!òçÄ2(û «ÒÌ*?,œ8œ<;)|ÇPíq Ô®Tc •8¾k6 o&ÓQË­þî¸WP¿ÛŠ+$…ÚmÂiäYÔ%¬ˆ¶ÞÈ/ýD<öÐëˆYê¸î•ñkÖ1™>º[!"H©t“ü­ÿÈy^ÀŒ–Ä5%*wLäæå{ÕÆÜî6]ó)ÏDVIz‚W³œk‹JâZy½ùø°±µè¸#4«aŽÚ°ßê Š~¤áóåɵ¥n»ö"]N²'3Ïçxv67N+XÊÊØ_ÉU¿õÖÚ oLi†%݇J豸0Â*v$K•ÒÖ1¯pÓu6-˜J<üS³ån"”ñ-§FB /Hïv.Ò×ö Ôø™G_w´> 2{j´OÉšDj~#ÔqùžLJZWu ù;NË-¦Óßù;¨•û«“Ÿ|HyÇt1¢Ä ¿º-^oRbÄpéÂqxªÑ[™óùá T&íkâHóî`db€¹i?|qâ©ÁNë½{hç)瑘ëJi4|yj ¤ÜDc­Fì6`S"/Y“éw›ó=”²ã:Žm£vÌŽ¡ì¯µrÖ!Ñabâßlüˆ `v=¡$d¾ùd Triͯ×AÑî9qbÊ-Ç\k>!96’®i#ø²…Ã-K,Šüj¸•Ä,Cu]#¬j©‘ S㮕N4-r²W”QQE*Ûïm M/ ¸b½%™šd\÷ƒðöJIV³Cný6~ûëì0 tL¬”ø*óÂrýR±ƒµ`åÀú¼(ë2¬‘{ïí› 9Å^·¨ø7î/yü7I<ºñJ¦ŸÉsÄ´ÈDFŠGxè'GãÊ;ã´5fmxp¡f“ÛëñÎ(á`jPFCE®ë:̹6ó©ÈÙ—>/ß‚§ÂCù‚õM±>Ñ1FNŸÚ»Ò/´C¿^ •ÔO`Îý¸IýL<D²ÛÍe»GUPµ&é´v/+z"û¶‚Â0qÒWý˼¯B‘µKân‹qÖynh‚âògÖ¬V¨ Yüñ-b§ jïë-ºw®»à<¦kxTÝbp‰z>[ æ94®gé0´›][ «Õ€£ºËǤǠTÀ±@^í‡ö-¬ÝÀÊÂ] z:Ì¿"D Àê©!ƒk$ý̘ *I½´Zw›KUÃ9¹#u¾"-H‘~æ” 3EO_«ÁŽR½o¿Zy‚ZaË̇:¨ÙÔ|nnzµËîv†ÈÓ.ï®Ð7hIÞ©³ü À ò4¾ó g4^4Æötš ‘åÈM/ 7&Áyn‹>áThôz¾f‹¹êtZŒ-Yäar§ë•eˆ ûkê(Áôóm“Ú%“;À~õ1(ÿ€˜U"\ƒ?‹»xÖ*¼ª$)ÓC¦Ã«‚ jöjE%XeSí€Øtmã(&X_û©½N§Þº,ÚöÂ.­ªÊnPú­ÿ“ÛЄþø”?¡ÒËäc¶š5ßÐX=+á0‰¸M¤´IÎ+©Êì¾ëe—Úë±ú‚«ÿ(z°s!Ú' å¦4 k /Zª;±U“ z¸Êóa ¡Ý³Î4a»C;T­ã3þÓ-¦Äj[$œ8xD§`Ñ뎩-ý ^oem äŒemò šÐc ©E©Qñ,X©òðçh“oQ:T­KD¯—2Œ‡¤J›ˆöE}œ~ЦòuO —™&åº<ÝÝ.?Ÿ¬%?:¦«, ù…Ã…qÁê É‚ãSbwÏ5j5Ãÿ ¬›aÞ'¿ÿ'Šà!š™h$£Èo±3¨§R§ _ÈqóbRD1=\ψ¸*7T¨Åfuô­C¶Þóã+&uA>5æÚmK®Ð…WP´ímæÂ‚i‡esqñùj°<*çϧ÷^ÇcG/u1¥çyÅGRidÛO¢uØé ;:tl} 6ŽæeKq3»2$C5 uÆb­ZÒJ¨ ûÉ+±aî¡×VáÁs‹"C:}øÑ¡ËåÛ3`a:̨‘°S#}ܽ]‚¯@zµkED9ßÐb{ÓΚÏËÝQâÓ¼ÍYÑ_n#ÆDÆó8ƒ„óÄ›ÕKødÍY 0਒V[| ˆ9 ¾jbCË4ä-„÷.X‡–Í~MäO¼Š(4=‡4!¢¸Ë)¤$à¡…’ôÊd éùØür+‡ÒŸêýÐÑU}Ÿ}€4(LM>÷Ñr‰^6«qŠ(fÇÖªZæLâ¬haS´8ÒùwìúS.Yûœ˜s›Ú*]©6— ›ðÛ.”¨ÕàÏáeSÓg›C¬™f:oµøë¸=–O–źHÇ"&Ø‘’{€³•*º$2©ÕÚDîžÚš#²ÏÖÀPIMËrÓ֒䑯X|ü˾ˆ.¨ö¡ë[K6±Í&€[—·fW-s[7-b¬ÏòîpW0CF=9c•³¢ËÞu©FKè60)nZ#R¨>ª­™9r— SÊÕ…cª,ö;¯sè{AüÁ³Ú®Ó=9ÖÉKÖ %Jšg¿'MÚ d£¸t¸9¶Õä‡ï,ˆíã’i…¸wŸ¡‰¼,Iùéð}^¡š`‡dõØÒkõ´mÄÚÚt K6e–VèêæÙDËÀ‘e½ h¢}º1Œ€³\ŸpÍÒ‚HK]ýó •tÂelu2ËvÕ«Jø´(«:¦k¹§wqÕÇö@|!¯ì²B†‡ùÆJ¤H»é$¹‰ë´WÚîQÕ£T (Œ‹O½Äè}œ{Oµš&Hh 1Ö¾g¶C)»IXkäÞèK»${ZìF²³’ÍmB6¶GWÂS=kzyÕ'h¾*í&Ïú(áü–[2µ—QD** ] û`·Ò)"y¦_ºxÐñwP[÷‹>¦/‘C¬VðÉaJ¹/Á­Ô0æê{L‹ aÊ¿áÍÇÒäòµW­‘ŒªöÅ<7Hü”ž8Þô½$T+îíy½Vx•ñÂL‘kѧýT?@±>¥ˆJ$ÒøyÆXÍåq‹£¦x¼$¿‚ûMœc µÎ iIz¤ã9ü䓎†$¯(ƒpä&¯»›O<Ë-¶Æ¸Â©ió'ýí¸=ºx¬€œÜ‚A7G]ßH§¢ïPÃëë[Òr”/lîXU3nîåúúƒ'eËu1ü‰iŒ¢%£Jó›wÈøª¨Îwv8H¼ÅúÚ»ÞþÏwwðÄgãi0FퟵÕT-Å>oC‹ÙUà ¯+r4Tª3Íß}°~‹CûÔ«Y/ õ–›„¬‚`ý¯syep8Uã–Þ`œ`D%ð1XYÎ7ž­ÃæãÇ«ص¾)À|wY;f´û½V½»tC³uj0s“DçŽ63VÍ0¼=Ú£$úk¶x.k|U«£†U}#ýY2 6g©`´Äâ7jX«à® K«Õ`SÖ9­¼†xÂ[*lª’gy†£,ÜEz´tláXáó0þÌëT±è‰.¶i¤)¿Ü&+Ö¯n¦2L[EêØÓê%¢êTÖéP¨ëµ†bÚiù &ògч~ˆª©û¼§!q½#[?Úý0Çê+ èU£‹ pŠp,ÌLûxP©;·Í6-]d²¬Gšj—üS1¾ý<Ém3-ªïû*,)u/(ã8#±U€ æ•ÖáëË$rÿŒ¾¤kìDáæéº‘';È^ ¥dƒ.W~o ð¤øíeº©²ëê†WÅÖe °ïtBe2 h›üŒY´®:dª§“âô%´AYì}ܼªP¸³'Tå|¹”’.4óÓñ¡Eú¢èP¤r¶”¦ÇP³IB¡âЈNpBNúÁŠ[u®­veuÍY’]{ªà*-Ö~ÕÞ>ëÛ*_‘)«3½“ÿFúõ©æ¦Š¤}œ´2è˜Ð#wåú M€"Ë4áaf j:Ic{ÌÞ¥V ë3<ê£6…(Ý$ý=aÛ‹‡àe·"ˆMDÍÛ`€Âø ûL™ÐÑy…éZ'Kø­ º¬ 'ÞÞ —ÁSŠAv’öG"§·¯U4PbÖ¹–ØUQ ÏÀ¼EoŸã˰7Çllûã“q¦Hâ.<š# Ó ˜¯Ry2Ôt´HW$rÈm›:wÁyÐcÄZÛŸ¥?±Z±™‚Áø˜¡ˆ"^?lá@â:òëÄîm¤ i²av4RêµÍÓš'í+Å|Õ•Fä_ÊÇ\RWê•’l´“¸‘'ê—™i mì•î…&ߌ˜cRÍNƒRÞÊ#Œü«å¾D§F‹ŒÂ'%®ÃjM¨S]šçceÝ<ÌrJ0Ò‘æþŒ ²PRS 1„Ê]—ãÜSì l蓉íгrѨnçE+ÎdýejnvøI0ÚÊAóW3å–ÉŠ“Ïïþ"ifÌ·s‘Ööè¶ì¢suLuÞß4A2b0Rq[2°Œ­/ ê@–ç…´ùòpsÇEf­Œ®Åóþ³Œ-ùÄÑ u¼jœ& gi•d>´di° téÑ<¸z‹-„æÇ¨Ú-ªRO+®Õû¥·o6„Rä[’è§Ä‰¾óPP5EC!Ù e;^·ê3|~¼“‘%8Ä(< 6,÷ŠõMõÞÂþlÓÿ€%¢³.¦ÝŒt+Õ) ³’¨ „ü9 ”SÖ¿ú|PQ¶ ‹pùs9†ƒ ©! d`¸ê­Ž4Ì»ìr•£F¢ò%‰ZD™~ÁÂ7j4Ù£Cy’ÎÖÑšÞ5è‹ » 2à"åûûÑu­LµOõ¯|o+¬® cE—àˆ¸'h"h>ŸËL0P¡‰ðê8‚æ>¢šãÂ5:xk‡gßg[î­ãoh¸Ñˆ¤WÔ€¸ª¦µ¼ ñ` É Ìï÷½?¡òºEi ¤¡„ ’KŽ2ÿtR/è”]˜"Ÿ8q¸Í%=û™{T’ƒÜªç{£ª¸*fXTÿ± T4¡O2É ÅèÎoö«éñ>w¸œkñ&8›å˜(QX…Ò|´Ã¼ÿgði·S~³€JŒnOÆM¹˜$ûÉÌ“¹%o0È„é´ïu2Òò7ø¦‹÷‡HVšÓéÀ·ÌÎÂõC¬hi.ëóKÒ(G¼Óy­Ã%[z¶Ëú_E×lkÑX[¾Û ´b“Àž§wPVÊ8«ÃažÒœlÖ´½é†´²ø—/q,ø3~jâÏh㛑NÌ8E›•>ÇfÛQ1‹Ò¢·<È••ÖjÂ!¤é+"l«Xž‰È;…ûcM@h+õ»Áš˸ù¿p·;,pÄýØW›uì•&8+Ø.æVf/³cÎ/‹záë¼Ý8õ@45¸»?(©øiCp&ÍÍèÅ,Dð£Ë%½Ÿ¯6&uîàÅ¡ýÂJÿ­5;ùþÈ S[›ï3ŠÝÉíFyŽ d÷‡Ð“«Ï¦Ú±ŠåØ7äbÜÔæ}ú§Z]©L~éòçŒN ¬jÛàtþT` ‰ z ŽO©–±ï æDÿ^ ʭΪ߆YÞzØtÚR3ýIeYÃÛ_Ií°SzÁÚ¨‡; v\èÛ˜Îh>å›G[]ü üøü]ïu¢W„”…ϵã–›PôÑ&Ú¨9ˆúrÀu¿EDD¯ì&ЉÏÒLƒ Ʋâ-J½ *DàPìAkºô»hÒR'Éݰ¿÷Í]˨š‹X>ÇË~V‰ ÂÌMú˜é×B])šÅ‡ X».ÇF§ø¬LáÓ‚Ê×€šYÖ*UXr&+·nXYƒ-%ÐÚAöÀ£A6~éXÑ"½B觃;ùÐQuê*ö“C_ˆðtw#NÙRÇvƱ/cä³½ZZ‡x¦Ï7Ù].DòT'B½2m;ð)ˆø¢Hßÿ4 ¾ó,¦(†½áØ'L²ÿÀÝ<:2(Ò~ÿ`ºp’Î×"Þ†º”äÀøÕJ€ç!ÈO”õ[èÁÊó+Ib–Z…KÚ0LŠn`ÌîÌ%‡bêüžj÷תädÀk œ«6 F®¢÷¹¼HjÔ2”¶ƒ[ýÔg'Ì ±÷µ¯sÀŸ& :­Y¥^Ý&z®ª:Týs/"3ÂòÖòh›Öð—œ*¾U”ƒÔ»[ºõŠ:”žÕ°WIa°¿*C±’Ë| µnj³úŸb“ß:˜~GsôŽØêåò¬Ž]”´ ;³öõ„í*!A©>É Ýàâ«jw˜ya4{-Uªµ«üºªt Ç 8öRˆÌÆvú”5Í~ñx†ÑZÖ3œt…ûÝ ¶ÈVeY‹î]ªpðæ¼@ÏÕá·nÜO=jó=šá±;4ë#~4Z}”HS¥±‚¹øÆ¢ ÛÌh¡qYÿa 6xÍm¬l“Ÿ#¢wÝF1cq°I2†z¤FÏy u²ë",[@ù¿~D^wÿöa"d”®ÔCˆ;LZÎçèD$e¢µ… `Tüâaò·_Ýœ&ƒU–ŸÑû¶™I¬PfþaÅD3w–„%9"Q¾Å‚Dʼx…WþÒ‚©\ÀíŽÒJ¯A®^Äo ôËD—oŽW[Fäú:mq»»+>À€Ý&Ì.[ñ”£ü¡û¢Àͱ.Z\ }%AQëÄþãÕJ|+¡-¯ÌU‡pÄ)b1¦ªjjVÜrû€¸&r ¼­x½aû5›D‚½9øvî=ã;¥¦£>Z8m j‚ÓÐg¶@]#Þ;-²DVMÌhv!‹âpœù-É_™Q^ŽWx[¸‰ìàëeUÄow47´¾ÄÕžûw½XaÖï®ôño1îmØvéL`¬P×RË5y¹ëˆ’ˆÛË–ÑS$ì™BÜ@‹Bé\À¥]1òéçãŒWê91Òº™ ÌyçÀdêÄbø¼¬ ùü$ŒÂ÷5kYEÑ.ûPŠ«˜»S!6Eg¦RŸh+GN '».÷Wë*EæÕ>àÿ‘®„¶­»„âá×0äîͧôÕ3j}JɃӳE`®×Û%džæ^ >¾qTÞ×zMÆf^²ñž‹L¦è‡ A§Ámÿ„R™ wñÈôûh-3ÖÝšìp. Gc ’VÅSðk[RBæù®ñbö­¥•t¾½ ùõy|W˜º½œ¿³3¶²9—ZÆîÂMjê9u(ú¸‡ÔvR)?¯ÿú¥¡…ÃÏ&Z>º7<ÛR—bûMÖ:X,þˆÇ^§*F;¯7ßu¤£›ð›ØKŽ Ø¼ÌTÎ5%<¾U&Êù+Õ°²1WuªÄm×Êš³Ê»ƒ‘ô´³š¢q8Ũ'Då« ¨kž_¹ÿ¹ÕP endstream endobj 532 0 obj << /Length1 1897 /Length2 11724 /Length3 0 /Length 12888 /Filter /FlateDecode >> stream xÚ–uT[Ûîq‡â.Š[‚»Cqw)¤¸»»w×âVÜ¥PÜ)P(NÑân#÷ôÜûÞodŒ$¿9çZßš{s'TäJªL"¦vÆ`I;[g&3 &¯*§¦€@6f ‰ŠJÍÒÙü;ƒD¥vt²´³åýW˜#ØÈù5&näüZ*og q±€Ø N^/`yþShçÈ 7rµ4È3dìlÁNHTbvöŽ–æίJÿù  5¡€xx¸ÿ\±;ZšÙäœ-À6¯Š&FÖU;K°³ÇmAËoáìlÏËÂâææÆldãÄlçh.HÇp³t¶¨€ÀŽ®`SÀmŒlÀÿ4ÇŒDP³°tú+¥jgæìf伬-MÀ¶N¯‹\lMÁŽ€W}€ª´@ÑlûW±Ü_Œ€¿/Ä úg»¿Wÿ±‘¥íŸ‹LLìlìl=,mÍf–Ö`€¢¤³³»3#ÀÈÖôB#k'»×õF®F–ÖFƯÞ )¢ 0zíñïL-í˜,­ÿè’åm^/´„­©˜ ØÖÙ éó‰[:‚M^¯¼Ë?·ØÊÖÎÍÖë7›YÚššýÑŠ©‹=‹º­¥ƒ XZüïª×Òï˜9ØÀ¹_o,Øv7±`ùCDÍÃügôGøµ/{;{€Ùk+`K3ðë’—“‘+àìèöñúwâ¿ ˜Zš8ŒÁæ–¶H¿w ƒÍþâW8Zºt¯&€¼þù¦ÿê3S;[kßåÞhyÕwb" ÿ4ýOZTÔÎàÅÄ 0±²±8A\NN€Ïo¤ddù÷AþµTÚÖÌÀó×y_/ÔÎìú·hÿž:Àï¥`÷j`0€ö·ßõ€@“×7Ðÿ·ëÿ\òÿ2û»üøýÏ$ébmýgíJþ¯ #Kk¿k^-ìâü:òv¯Caû¿¥šà¿¦Xljébó¿Yig£×±±5µ63;ç_aK'IKw°©’¥³‰ÅŸ6ù+¬þÇØY[Ú‚•ìœ,ÿxÔ˜@@àÿä^gÍÄêõqâôêÎ?Sà×QúoU [;Ó?fŽ•ƒ`äèhä|5+À ô:œ¦`÷?ý `a¶µs~]xíÐ`fçˆôÇ­åä°ˆüú‹¸,b¿‰À"þ›x,ÿÀ"ù›@–w¿‰À"õ›Ø,Ò¿‰À"÷›^õäÓ«žÂozÕSü‡¸_õ”~Ó«‚ÊozUPýMìµßôÚŸúozU×øM¯zZÿÏëYŒþ!Ðëܱ€ÿ…¯ŠfÿÂWIó᫦ſðUÔò_øªcý/|mÌæ7¾Î,‹í¿ðU×îd­}ý=ùWúUÉñ_øªäô/|íÏù|õ ‹³›Ý¿Ò¯-ºüFÖW)?ñ¿,eââèøú˜ýsú_ýöþ󙻃M–ìLø‚?ÔwÜÖŠ¹1íL°õsª_¿¸±#ÅXCn1Cõ)à[•±ç_q'g‹+ZVëBËCC†ÆIÄp¹Yñˆv2Ãcb…`BIE17ð+ð¢œ"ÐNû ã£ñSs÷Å<¥NÈ+®µ©ÅÆ1UCípüHnu~î9(‘VV!*î-ÐñàÞþR”²öUæ…›î~ KE–én𾣑ÑAn:ºÁªêÄ4œ_Eåð› }‡ä\jL¤]ÆÅÛ5ÞÍzoÑ)+ÜÙÃX™Góó‚±xøfI:Á—ò­€#—2n{$À¥/©D\ráxœµíJ:FQßÞMprŽ>˜w%í¢™[Àa±…Ô¯XÏ®²ÃaÎY)Ú“\Ì™nË™1Cʘ\…(~ÜÐ|é·ab‹š‘“æûR!"­ÍG×/Öñ;’œñï > j?Î' 9¯£!}õW“Ѩø‰q fD†u„Vï5”5Ò-$>öf˜¢ÍÝ“ÝXÀö•TÓåîµ¹'mÑ,Îóš ̸êëœöVîV{„6LÊOƒâË´<¦?û‘ºN²éŠT<·¿H@ÑŸZ„üI0W@z6+C®ê&GCÇ±Ü oÜìWŸ |™•‚ôiÕé…x)£õ耬F6I­DbÚ½›1ýNCm²¨‹­Ghºú±®”Êm81 Ô"*[Îc\Ǥ/¹9¬2SâzÓć,–¬>ÉŸÄ­D@EkdƇ…ßÁBõ8Pó&¯­t×KüLÖÄD_LÞHCü=Üûó:z/Ú°/áÔ@„Û8n4šëRTFŒÄ iÔDs¦\Ì#ÞvjÀXH‘ØŸcMm ódkW:¿~yVÔ͇'Jois4[Ѧa¨¹ke Vã2K í®ZZÿÀN ݤGýŠEvî+3¾*³éœµÓÜÛ´®® v4àó 9iÅ(]øUI(æÎº§9– ÇI…9;¡=_‚z‘c¿¿Éuý…ßNj5\©4>buóÑ#Ë»/ɼ::4j÷Êúbò¬hy^pY©Å0Š™Y\ö–ùqåN£´mhpV-"„¤tòÌhú·½ *Úïg©?¬¹WcÞè§<Ì)ˆÝà¸nuô‹èŠ:•~ëo`l½wAŒ/X}a@rNÅIS;ôOæì´¸&ÿœæôd š—údZ¡‰ßéZOB 382QkT\çg~¶¼ Ý“ñ©èg4´{–4Ð:Æ"…ó|¬ƒ¾—ÀЉv‡ÏD7(u%1[~,ENW 8Ùmúp\Zör¡ÐÙÚAœ%Ôô\ÞËPíD™æ(À’©gÖi3f…æ¨;>kºúÍöñÍX8ÖE}Ãg5`L0#ýq‘Œ’‘ý‰¿@êr>”•#œÙ~¢ÿáµrðùô5d ¡]s`7óÙO« ÂxϽ¬é ßcÑqíËíúÈÏ Êo’XÈ1*c/öL¥Aob÷¢ÍÝt  –”D”[õ‘EÒ5ØÌ:÷Ó«†)o%¹bJ׌¤ß ©‹y„½ém‚9×IBã1y'Ò¼¤x_PJ ¢<Ð{#„Ž &¥í²ÿÑut¾¬õ…€çyívðóFšâJ{z©;AzÖ[¦Âev:„Ñií›CfOzÂyl¨|(¿¸ÁûEW­½wJ˜걓̤®jº=»'å1ëÒJgk´…1JædBËOŸ6W-d$Ùê?kÀ8ø ¦*_ad+ˆ6óf~{p'&}~hÜñd‡{ºá‘-px)È? ·>>ê)–ò´Á ÍΑíέKs\ÓWñãÚï¦è„rÑ÷ËÛÚ¾‹8<ßC!ð{Šoo†'Fr§«8Úó¨ÉI2z–Ñú»•tÉG]Ý@½€=‡÷Mq´ L*ã’§qñ”º1 WaeÌ« ¯%×+i4#Òä@;CÞ]ø3êFx e±J©·ä5 ¼ür5Ý}ˆtÓx5“h³ÀXÿ0Ò\O抜iai˜÷Óõ]ퟜ ÙëÞu²:‘u.­úµgR$Òû–g:W%Þ52~U¢³×á«f@PnnasšÅ,'?Ɉ¯Ñ&ÐaüƒAA£àÝ#Ôo\{ÖH*B=ÛtåPIšŸšìqíJ&48ø—¹¤÷„Yrã»8ûÌßk|½x!ª–´KÏÃq¿†"uŸ} â : | $Y|¨~™µÞeNíghfï‚§Æ:}étmcí™çGj$þNi<ú¨itº`¥Þ2¹ßŒ*7¬€ç£/‘êtP4æ–!ñت¦4úžu>}êÈ`w½@¬Ãž §Ö¸hÒèð-Mƒ«û“Êj #6,·:zó¶­pÐ/|þÑÅV…<ô¼ÞcÚ~ݽWšƒ‚©ÄXÙ£W`Ÿ¾È^Å8vQzÃS^ÑXÏ‹Í0¼.hEŽèl$Öª:7Âøv¦&Ó",£š)ú—Cn¬š¶à¤ß—›µ;¶]¯ ¬“ç ¼û Ó+ÚãÚt„'šê‚)|Ùz^õˆó^³âAµƒ–‹œÔ2”â·v+Šç%¬æäwMÔÞ Qîw£“½U‘H=8 2¥W<•À¢ùåÆÇ3eý]­FÏiϬ|ÈEÅ)ü4²/ô9ã]YÙ±‚IkRâÕ¬Ý{Æ<ꌋä=Šp*gï‰yVö°š;æé¾–ø“;µ½ËóÖ®=2¤°„: ÔE,Hl4½ÉG×Âøä?JZh¶Ñ•¹O¹˜#­É™É6ûþSLþ±ü˜1¨ Æv"$Q_•‚`/¡½nR™í3 ÔѸ7'ÂÞ­'†k#|M†„Í¢‚³é¦ç,º—“'ja%È>Ozžº^ÿÓH¶m<:"Ê@S(¿Tʸj¦6Gx,®‡q 5¤Wnòͯ°8·6ø¢Ö®Ù1 í|ßÖWuf4íZŒ[q݋ˤøê*cn>r¹f±î“£¹%“³ORħ:Év×ߤG ßìošæ3[©'ºŸÖ^Û#ÈdÉËèý®i×Ù:["QóTÒ‡¾-æ Iéþ»p#f*ÐøÂ×U‰ô°·ómŒÁ—D¡éóÄ‚¤îu¸Wª¹¾%ˆÖúŽ4Š¿žq•É:Hž&³ö÷¼Ög»Û‰Òàgèˆ1 •%¥Q`˜CÙ¼í³Ù·„Ô*ïCF‡Ù_ˆ†£¡½VÕI®ªeûê_-ò“}ÝŸÇ1NuѾzÈÂ&Ù ª¤deNQyàºÅr5*Ea¶¦eȵyÎ|FAá}vŽÿîühÞëÞ)½ƒœÄøÕ¿Ä?Yï"È-†«Ãe»î@h$$ Zzke[z-Ïëˆj–á»É)Ò~64w³¤¤3GLDüÓ°T$²]V>¬ž¨åx9È‹VräÓÀ-h“èZ •ØxŠz`øOzs_la‹/$è–÷H\´øÜû¾û†2Íva+!¼/úÙVKL¦ ¸¹L^"Ò5£|òR§Tºj=];ÇN;qÛIoÆÌ¥ÇØ'Nw=äÊG~v”±üzLè¿â`XŽÏô7.jœühYªÀ-Ä¿lÿ‚÷ŠÓÍ@^/T‰_[]fÂòFÞJÏ3íd ¿tF ùa*Œ›Ý|³®`~2ÝK†²<\‹x ¿¾/T99^g§™Nì†å0˜¶-åkPèÂæ9Àÿ|“µˆˆ§å6§Z„\U‚®Z ¡ÛÅ.Uœ$዇ÖpC®ˆ­#gÓê×KÐb èêHÞ]® ãñâ–Ìó¹ÿ²òq•‹ Èñ~8Âu0`SÎÐA},çõßeEòî¸@6±Û©2¤ÿZ5ÓÏn,üø.gC®F_wnº'ê#JN´09ýw~U %}²ûó…1Ô6TçVˆ-€š%FS#9bì bù¤}Ÿ¶¥ª: †öäÎÔùÒpw Œ/ì4ùƒ*NVª-<öq6Ž¶ï±‰Óia—]µºö¢Î{Š-±N{k@y«­®Ÿ öáb!W ÏãøÖó*•Ž$/º&Àã2[e™§Å¯:4zóãT›´Ñ3œ4TÞÊõ<í/ž¶O#q¬0€¡Þ•—@ÜC®ðª¢(‡"  –àÞCèœi‹cïfÖ#Å =ûD¹ºÈòP$Eªªà F].¡nŠÉw–ùlÝÖµ€O«nÉ’rP´L¦Ê׬ŒÙç¶ L¼øVâÂ0åÖ;;(j —A‚ÙšDM©F1<ÍV<'Ÿ7Ÿï™pÍ(c˜,ïÏ£ý”üôã>0颪ö Eÿ< ˤØéš¥=rÍ••ãI¨A8—“"FÕfmyÕ:@èw¼C 48gˆeÞà/÷'B‚?7C(Âæà@Dñ.îA||#8¿Šz¡ºÄuÂÀÖ œÀ>N`n\çõ±BuáŒQÉipê^å¡Lì¦rù| Záî»ø.ïW#õ¡Éb…åêGûÎê¤Ìqõûý__[j:¢3ãØ=’–ym¦øÞÆúº@vl¡ÙMÕOvpù>©[v¼cQw©ã<2ï žÒ”V•²|61,§ötñ©j×{’þbà!›lÌxçŸ>¹oúass-`ÓýmrµŽéÖ· 8¶vX>m(dß•åTÓ+ÛÞÄÀó– Ê# ß#Ò“ÈÊ7M´¥SÑ4›Â³§á¯—V4 ¸çG߉C`_ –ò[£¶%6èDO5¨›ýX§¨4ÓÌ8ÂLÏl«…òÀSI—„_-­Í'°CñÆ:é°æã /=&×öžÍ‘SQsoËmäçÐáìµÐ¿×ÛS™V?Û²Pq דñ†éÃDñ|ùs܆ßp¡*£Zâçå¸è )™MÐ¥:Móåm!9-_¶¤ÀÝÀ(%Ðè¬Èßù8ØÁnJ4îÄ%ç­pUèwQ¶pUW* »ÂqÁY#y«ì–|l…ü³œx&)ù±ÃøùfÒçâÉ:À¿Á14 Õ{Ê÷Ý))ËÃIzKW¦1ñÍdf¼‘ø×æ¡{ê<1)j+?éþ‡h…¢3Ör÷ñòÉüø°¼Êê·)H†|Aõ–½ˆ—$ŽF²2lÖÔmøÁó(› í²åÃfË9»Bµ”\{&&Øާª8ø«=”½¹ãd«È+|(Gß1¿”JÙÍ»èì„ÁóëAŽ‚ÞGbLe-tBR[â¡P‰â]$zº~™]*Ý!ó/ì³é•BCÙÄ.'Ù}øXÚïÍÏžÓa»Fœ}€%ìÔÑ«O÷_ÍöÑ“BáŽO6'`®ÖRúÄŽÉ>öYœW·N•”®gY¸ð½GÏ[=ïë„О†ÏÛ¯(¬‰®c“ ›ÛD›Ä°IÙˆ<Ï$}y%ì0;[£¥NXe)Rò Ó}4k)iÎ5\„…+N!5ãZް·t ¼í\Â5h¾:kÒ6í¼Œ‘¿ÕÛÆZ™É>Œj—>O€@F4¨0ôž^ycÐ}ôù—¡yvLãSÊòMֈ̓ve£›çX1}™µ!a_ÿÁÓ%4%ÜYâìFäK,ËÜÚ÷ ¤ôjüõ¸=™®yÄE†€LÉK\4Ž{ïpy|äô sõÌŠÅu¾q™çá5À¾ðI»—ƒ‰o%Ëäõsµ49¦©£LnÕ%ŒG¡oªÑÅ´s3ìèð¸°pðQ´'ÚͲ©Æ¢¼w$=>­s¶ŽÛ¹ÿÄ{™©ÔF鈀 ×sž øqîŽ[¶gi/Ä©FdP–´B•HÅdØ:@¬DãèV‚vß‹ã-\”Ƴ¡§5à]è!øä#O³£U&Z⊠ct˽)8K‘=±:ºï8¿Iã˜ÁëÈ9 ¶¾\(ÊPë…)φdœ|œ1×R–j¥øÄÚªõlAÑ<·Þ&”B1±¬ìéòê_ !3‡Êù.;ZŠÀ_ÀG'1Z±ÓOhÈÈ.9Ëù-0NB—~V20‡3€$ç·U¨”‹å8†.üÉŽÍE&F'&Ö'G‰V÷‰ãÎ=ärбJ[ûò›w‘¬6Z¯Ú¼µ¥É;±ý¡Œ|„dÙxW0½Æ‹Ý@D>l:Õ“ÿÑaÿg‚ü/¤ÆèºA«XvÅÓ#ûÏh\¸ˆêS$MNŽ‹Až‹dzŬËx Šî+E‚ëßú¸ix>Ž Ûg0g" Å !(uåùBñBvøŒÐ}?_éŠ,Ð&æzçCÆS*ä=>’ßPÊè~G™æ*ðP"L((Þ|5ÿlå;=F7!ÏÐFª1DeÁºi…|c•a0îy³ÄÚ†»´JLcsQlOa¬4œˆ€ÞÛ‘ÄøS—Ÿà:B¾ë`XÀWqa•EÆûû»GþI‹Ý8}‚µ?®[“$ÙŒ)# HÞon‹èÄ3øˆ@6êæ ˜é‚»¢ÚúÆ$½©™v<Õpßð¶BwéýäuÐÀœd©ªŸçøî¦Z±F-º‘<®»ÆP~U̱̬œ.G¾¥É¼ÎÙ©øNýŒ¾û(6_»|/µhy‹iÓy›ø’(,ìÛòÖ/?È<ŸJ&²ft¯³1/€¤.Æ=+E]¾êìAB!÷ss ¹-ÿà  Õ}*Îi6?ãJe-n#ÖúãOìγãû“.ü…@ܹ (»‚}1&Ì0ÙXU+QŒ¦‚A2ýf)ºžÉ«Àµ6û> î}¹A#=ÇÂÞç&ãS†Òbt<Æ™4ì;ƒã0— ôC rüºMÈ1´ø·.lV°<“çùVõXµ|Í%˜ƒÒ[cœsµlÔÞ)n§Ñº1’ǽÜfË]ß„–CÑ'‡ÜWò‚Ø7Ò]º "qЉRüE„ß7;œn\z-ý˜AÃ×ß×F4œE¿r;tòÛzzkŒT¬âOÕîïÑä Â3ËIÝ9½ò¼Œ•S-®yšk„úlëÎNàRË?¢Un|Yü&¸›Ö¾Iîo˜8Aæ±€ïs1iN¶†Q\ýhß2uÇyñšö.ç†êѸ»µãW˜ÕvÔ¬åÞV§2òðÆ¹‡‰èáÄv‡'̺¦yìƒaäœl$ )<—‰7Í»Rêþmîf,õ­ØÙ€S&°ã²­h £þZQ”ÃÄš°Ê½HÅJ@®!\è¼xV¢d¢ãU8?O/ ‹üŠ‚ZŒ÷½zèÜèb<AvšfÕ6^’T¹ à‹’’¼‹?_9'–‹ØÃ´·#N°@|^b} Èµ¿…;f9#Ò×kÝ)6Ùýôφˆ¼ü8ý™EQ÷QªZ¦u‘ñÅ11Áy%ù4>Õ0þ#øéë‡y.¥ã7^ñà!ʦ7 ÙwtãÉÖj6É-`Í÷Ë)©oE›ä›Ñ·sä®Ü”uæ[#Ñ¡´îlìXpWF `W¤—úZ¥êõÞþ"—ëÙ)üD ÂÎúÆ^0*¿ &Êtn’„b>˜V¼·­^+S$!èVPk¸'E6r¨ìn+G·䎼èVu:žV§'M€¾9®Ìºñ}¢{ùÑšÞkq^ÍóÜ®‘¨ÆÛAš&ú)JIVB}jïžGŠT·£vÓ+èW%…Pûh¨H+Ä’=X¯p²¢äÖ*Ç 9-k_É3ŸvE­ Ä»²ï‚²c¦3 Ï™qêé®oaŽ/.5™rp¦7=6zAxw+?U,ËÜx‰s5]ËèŽá'<†9½ú9ŒºÇ”³²ç»¡´ßöÉj+¦@Þ2†Øˆê^å•3÷5iyJ·QºÏ¥ï´Iå3¬U¶°,E0YNÐ ›±qÞhí4ªÓ]y}Ô‚Co? ü¹2CÍÀåþ¥;•à3¡ïwþmòRRõoÿÀÀ˜àŒ³{M=ÿÁ;rX"nEžpù4ýíÒúÞ®m†n={Â˳ƭrïÒ¶Ïò‡/ÁùŸ17lôXÚ|c9b^ì,#-O¿÷TI`…8ȇyÚU¤C$ž/ÀG„îWÞº®`Xµmå•¶aî$Ô)ã7²cƒˆf…ÔqòPŸ† 4±/;ÕB²¬Ž‹ygi#J>È—ººŸègòé¨úú…¦ëº”„7V’×€îÖ{³l"'jõ3°Àq+xå*zæcûšÌÃ’ã¾aË]žÛ,°°¬87\Qx¨²Y4&ŸÓSIØÀî~Ìc÷åC¢àŠoeÏÇX HÆB3÷Ë•â½t«Žƒ!•þÙm.Í¢'Bµ šß7¸íO¼2®×*l¦rè)¦@®J]¬2}Q´·Qã°VáEÙ}Nˆ«7±,bµ€Kè aÝ4—PJ&Œ7‘“ôY7:ª…Xu=I1´qÈýû2Ž :òj!´÷Í9i("W$zŽ‹>tߤaë¢TB­ýŠ2uL”‡ô\ëóÛE£p—Ê*Xx„|+ÊòÝŸúŒ‹ ¯êZ((Y§Ô[ `èÚÊÞB1„ͼxxß ùb£P@$Ä@ÇçJñ®¢†u˜®{O W·tõkiE]~\ò2VЋ Ë¶^»{“˜ 2õVHÒíÀ,o<¿Æ¯<á:ø&°¥§È‡Ë‚™.=è{pxHùaÀÜ=ÕgÕ}ÎÎU`mäò–>5sNëÁJÂL%_Ía¡±G´xã±`gò Y1(ß"žà±›ÄoþX¶…ºò¨‰Õ§B…Ì6øœ¥©]ÊD0$NLîtĦ£PŠGõ—޲:ui…JßáÁ†{†_[&¼¼ýæùµÚ˦ì×ä±cusEºú8"#|ª½Í¦5z²›H›l$Ø´oû¬µêƒÖ[êwS}jfB»:Þ# ‚kòßާ†:§¹ú/K ãÛÚîžÉyÜL7ýPN!Ði=Íwm[Ò›Õ![5Ìä°Ê i˜/÷5V¹!Y=J©evbLúö 1Sr´â*ÅgÀÍ5Ÿ{Ý8… j[0dW–xÉÌdfWƒô®ÅLÊ·I ¥:>º¼µúÞ7{™ÜÜÍL"‘gÜ#¯5œ9–uÅÊ*!û8s…Òš'#?cŸþ9õñ"5pä}K&^¦®Wéh™xBë¯Q±r äJ6ÙB_,8Ç„à€$n‰òF·³Ø®’ö^2m¼_½8&®$¤¦ÅÌ^‡°BœñWËû›¸š-An³œæÐôÉL¦oZìì,Íß!†TR|ãÌÊŒñh¶½kÊ\#ÇtWõ´Øæ5."e¿ªíëAù‹Í˜·€³íNбO‚£\7ƨlµg7dȈ"ÅûLoN:þA/oõœºÈù©ÅðôÛ 5͹ Âö8Òóã“ZhUì›ysÖ¥üÑ7ÀGá69ä†#ÄQ¤ËUèk!Þ@L8BŸYžü󊕘Ý?Þgà*ä×jv^hG,}¦Ì¨‚J) à'ÌóbcíÃCNHWÀMŸbK¨˜ÝI4nepK[Ð>4b½Ië“Õd˜Á>@?R_zÆŸŒpÛRåxàüÊ"ámdûÂ5«õeèGT°°J¾v,ž4Ë#wÂÔ&—„$õ…Nãó%*éªt™—ë¤iÉh•êà:œåûb‘Ðøîìí°ê£½PŽkŽÉßÀÍDÜĵÉ8£[ß K"ØôÛ»0n™Å$>¢¹ä+LךO$ÌAI‰Êã³Wn?¿ë‰ûäfW­dšÕpÔü‹Y¨©Ørõú‹îhÊ{„Ü %•1&qþ&ÿ[~¦|íuTß“¸Ê’ Öæööf%ÿœ…qöH:mDØëûà›¢¯¦É‘ûÓ¾j–¹'§°í„ѹ {tÒëý¬w8·û]‚0Ê£—]¿p#÷gøo[(³9`Ͱ)Ì宅 e1Ø8ȦÕ0£ª¤Å¾Ì£cîÒáñwr}ê¹AD/ÑýbóˆF,¨æá1Ò¦êR,"m£úåwšzc‰ÓøÄÓrâñ0BW$Df‰JEµSQV(ý3ÊMÙ"X?7÷Cf¥o&È>›*àÞ´íbÄñ˼1{cq^ãÆÛèiT57ÖR5ü½JÝ40zÕù 5æLÔËåtÊÈÅËéõ©¶<ÅÆ0ÙK£ýË1>Ü”†Rž6þÆ´toË^kC¿‘ ¡GB3_:Ë ‹$B¿Õv‚šA“@7B›—*RI…HÙlDÅ23¤ÂV!]Õt·Ž‡vÿKDÞ©¹¨ÂwÓúßDQ8;·Wá'µM 5Ë&XQ(ž±Km"72gž9 Œve‡Âˆ¶–dž"o>dóvf'_›-‹cݺ³z‰–­B¿Û‰cÏ16äÈ|S l x¾«PW®¤’#éüÑó0Èãû¥dÙ”™Vßb¹'x³m‘eÅ䡞ð´ÔnWûùÖâéZÁ›~Å>9¦ü ü.6çý™yª¤jì癀pš§¶m«Ð´gî‚qݧ,‹áfŒ2°nvCÔ@»Köò*Eó‚Øò‡ÕÌ0ÂX&Ÿ¿µvÿ\ºrîÍЯu¢ÁuƒéTŠÓ4^‘?÷>(MÆC L¾§Ù–†´¢”=—…7Ü.ªœ¦þx¸°-•/š!VÖ¯d“†,kàèÖ7_‰Ê–(W®zs€bhÁ¤xU2«×#Y¢“ì<ÏS¦}w¨”íBÊ6»-­3v|ê®fó“z(i”¿táõ›KU{„vjÂel³EòwdÞ ›µdµßã›±&j8r¸[¯o0ΰõ ¯`×°0-ÊðÞƒá;¢ÜÞ.S£îÈ,žBw¦ÃÀb‹bù*‡¬c bK²è+F}+O/Œ¸òÒû.fÄèz_ׇ¡ Ø04fæ å¨F\Máð3´z“Þ@ÝÔ†Út“h-ˆMRà:[@Éá¯~9›ÝÚ£…œÞò8I¯“1}[=|ïÛê‡TªE©oØÈu“Î!Oô <í·a¥' }TtõYàB®„ :Ú2\“CZΤ«N¯~® °íò{Î\{r0paÂÆ Òöwçá¸÷ƒœ \3Õsªö»¯•…RÆŸ°¾‹¢'Lïg;Ñ£m÷²-{ÒýzÒb PþÈáF±%û p‘Ü#ì·X³4fT[ƒë)j*pI­kóBOìÄÈÒ‚Œs¢™~ù%.$¡ègâfhÍpÑÙÝ”ŸÎqñÆHO³éù©€Î.üj;|ªC°ïÎ*ï>¡µó8ÍSR§F‰qÓW@œlˆ5êñ,dn‡¬é_›yñeÄ eײhZ22¯‹Óˆ±§’s·)ÎÀ.NãœgùdÙϺWr‰Í}ïqÔ²Çzx¹>˜|¹ƒ?èB’ó”*p'W~õk”\û¾½+|wOhËžÀûï ü+Ó«üt)‘tx®ÌDg¹U"Õ¸'ð;g/QéŒÓÌmG> wýU͘±º7¨ð8¾µ§¶5÷©7ª•¥Îì‹Á“1Ågúx—õ·<®Ù’dá*»?åWΠÍÛºþ€ VËÓÊ"þØ®V*ÔÔâ"ˆgAÅJÙËœþõ§=¢.Su8--ÛÛ%Ô‡õĽy>$%8Qeõ£\ˆ9E×Öv/ÆÈ§L¢-û G¶p}护ÜvŒ@+ŠîEã%3—!]š=塇qA$uAÞyã ¤â¹>q°²¾ŽUØÂ´Íªýºàæå+þ`†ΡÝÖtUðÆÌÄe†z í£3’Û-„³ðEºû|¸±à[¥†uÞ¬íÚÍ/ 3•¸´ùžô7ß…;-§¨kÇK÷r&ÈÅPÒ”rçåxweÊ´†ö±ñ:knqÐ’%¾ª‘•¾©ƒøù¡ÙÝÆ!ðˆ/_)ÛÇÐ<øm\ÊÕB’éUÑ-¯ËëãÆD‡Ñ³oµ?•ø¶ì#àÇ^òª×blÍî>´“ý S~Ç)¥Aÿɤ:où—ë•¥°²DÀÁÿl endstream endobj 534 0 obj << /Length1 1423 /Length2 6225 /Length3 0 /Length 7204 /Filter /FlateDecode >> stream xÚx4œk×¶ ZÔè}ˆ^g‚è½÷ݘa3˜Ñ‰^#z'„è$ˆ]ôè-¢$ˆ-Z!ù&å¼ç=çÿ×ú¾5k=óÜ{_{ß{ßûºž™õp²é *8" ªHZ$”(éY€€ PT!âä4†¡á¿ìDœ¦O ‰ú/„’'ı)Û£1@$ é€D q)„%ÿ"=¥ÊöÞ0G€Ž@‰€ ˆ8•î~ž0'g4fŸ¿n<`^HRRBàW8@Á â Û#:öhgˆfG°=`„à h¿¤à¹ëŒF»K ûøøÙ»¡„žN²¼Ú`AA<½!Ž€Ÿ-tíÝ Z"â;ÃP¿FH(ÚÇÞÀà00„x!!žÌî# m€ž;ñ¬ý øs8è?éþDÿLCü ¶ƒ‘nîö? …Á!=Um!´/Z`pü ´‡£˜x{o{ÜÞøUº=@UÁ`éðO(°'ÌBÁà?{þ™sÌ*G%¤›Fý¬Oæ cÎÝOøÏp]HDÀ_+( áýÙ†£—»° æáÑPþƒÁ˜ˆþ¶9AÐ1 ¤¸¸ñ@|ÁÎÂ?70ös‡ürþ2cz pGº ˜6 A0(óE€²÷†Ðž^ €ÿvüsEa`4ÀâCýc†@¯1ó÷„ù,úÀŸŸÿÜYcæˆDÀýþ†ÿ±°–Ž¡–‚)ÿŸ–ÿãTTDúE$‚’â@HHˆ‚þ™Gßö§ŽÿŠÕ@@‘ÉßåbÎ鯒½ÿp€ç@xÿÌ¥‹Ä0àù›èV@1 sýŸéþ+äÿÇòŸYþW¢ÿ»"U/8ü—Ÿç7àÿñÛ»Áà~æz¡1*ÐAb´€ø7Ô ò[º:G˜—Û¿½h{ŒNF ‚n oÿ¶ÃPª0_ˆ£> vþÍšßv“ŸzƒÃ}$ öó ƒ‰ÿåÈ ìŠyŠ 0Ôüå‚`4ôÏ}U`¤ãO±‰ˆ‰ì==íýˆ0³Æ¬Ä Œ*!¾¿È B ј¦Ç éIôs° 1€°æŒ0ÇØ›DÂ`˜'ÿãß @Ø †ðBý2ü£ °—§'F’¿è‚)ñ¯õ/ýC ¾0ÑÂ$X:ÂåyDûy­£à‡1¼•ÕÎØ$‹þ14×ÜãgmüµiE;ǧt#™úóQSoùöÏÇ}­ºóB—3Ô ÐX*ý늂…C_» ,ŽH§ ‰ÌØuŠÏÉÌdv–¸–Ü©fo.#%zD·žm_u¢¶îIîÜ¥§älŒè‡ ù;Ø,Ø8VÑÃVä 7=-³¼Œ5L&®°ÀÎÛãé¿ú­[&d/-½ÊèÏ=*Òê­EIOå¯É–?’2HOœ§ù…Å¥(vªT‘žÄN_âŵŒc'±üm¦h -yPÔ«ÑIW)ô†ÞýÑ&¯z¤Ø™üžå#&Û\ã¯Â$tÍ)±Îµ™Šœ5ŽX§ÃYŸkDὸ4,¼úη?tfeågÚØ‹Mñø÷ÃEm6'éÎíæ$ƒD¬Óeàwß?Qׇ³¸@Í/ï¦(8)õ5ptÙ\V½Fn }yÒ«2gMEœ|l~Õ>Ü}€äØg¦žM2ïÈÙéÛN~¡!vúšÂ”OE]§5‡ì²åMÌOœ 6,ÈÇÕoëT“¾'/9?Éžh*JVhL1g¬½…•¥Kh!©2CNJéº_Áül±Z|ô±LX³Lúàý·“×” vÉëÖoô|½n“äày ,B`£UÐyÏÙ®L—[}; Ö´“tùQÑb:ô@âÍrâw“`[ÊòûVЇß¾l4~.0W¨¹Mëš^·}2ÊÜqo )ëåänowú–¯zãÅ)î¥Ã°šÔ {D ¼ª)Q¬Uii€:ÖÄrÀ^»ý¤™À³gÚtò•dy&}{#ÔÝæc£îg÷o•ŠÊ€›dÜó‘’¢ëOuB¸$p‰cLƒ•I¾Ü¹Ib?Ù&ò!„å m"Ú€Ëi-ÒíXrè .Çæ[ŽaßjlX½i]éµAþV¡U©74À¦q#þùÌóo[t_ )¾Û¢g̤³»F³½äynU¢ùFË(gn˜<Î \ÿòÅ È^ôƒj9'½óøŽ/n5#~ñ4:EÝL¡¼çéšt=Û¢éòäw¥ÖaªpSd}æ[ïÖüݹžú4Vé´¼:™‘w²ëeUVìU_›Òsh§ ÷®{*¥Ï—àæ(;Ñ“ÎÈÛ äÒŒä‘u¸Þ¤yè…o)hœëÛ`WÖgû,äP–:j ©û»ò€ÏDÃ}¿%±Ä …î ›èkÔC´Æ+ÆP ‘Äûc5í…{»Þ݉–…-ßæYšµ9õ åw²ÕãRoÞ]ÖçNÐ|2ò6Ø;yV`€£ÝÙ¤LGî¤~Gn5ÕïM„„7é­Ì[}*h],U¾X7EÌæ@4=ÖøCýhk€ÁÏ 4:¼E7¢¤(1³9ÍII¡F\|‘bèÿ„òøú) zÒ†BÙùÝÉÝ¢€ìì5Åô‘í7A/òQ"Pn¥c¿åµZÛÁg3Ïä­Á,wRë Üáô›×´b.o»êÉÐî}¯’cH)XÒGª«enU·˜&lãCµéâÆø`x—}EŽõÉG¹Ybì½#t!<5Ë™\<ù‡^Œwmžá§ÑzÉ$#€ Žþ›ûawãY‹§øY{·tIý½Œ]Þó,’®Ä~ 4ê)~îÒ ÊCsë€Tú=PÞ¤Ôa„uõR®ƒ¿š’;gX d©Ä‡íc]ƘøÃ‘Cý›/Z¤~t¼æêHP¹5ÿ±Ä‘»º÷C£`Kñ+,aÆ~çaBPôBcüü;Zb·‘Èš{— }EÚ¤w&^ž,<7N ©°«ãrµÕK^·j½;9nÊçÍú‚ï‘Ï?÷lá—Þ?ÖVR{ˆÒVg4þÊNP¾xÓû$o¢nò´mT>TLæ(·TgNKÉnÙwæªkÖhñrOuþîGÅ úŒO®õo{ñW ÷xg'lDæ9ÉØ —W»nmXñãdŸànáÈ™W»·é >´R?(ô{D˜š¸èÍzó3ÿý¤â–¾4•FpÂëç 8):;sÂOO™ivÐó‘8—Ꜩ}¥†OÞºû[ìjâAÄ¥»$ûøùÖ BÚ¤—ñiü[µ<-¦³‡+qjåÕp‰0-(£•ÿ²gížÌ75öîÊÛ#Qæ:€Rž.ºÞôº¨ÏôþÂïê›ü§µ{ïE¶Ä*_c¸-Höu¨²çÞÇpÏè¢ùXap5ºš ¦þÕ*ý|³ÂFZKwÞY7®~Uh‰eê‹×)bŽÔåkx T$–BK;±|\£éXÎÕA¼å‰0ö‡“½ŸÃ8€ÌóßCªzMå`]7oÆúoÝèì*‘uüáâgœó0´·ÑÔmp3s•Þ£lÔIi˜>ù8ùóüËÖœk’þ×Û>Ç(- ÷¡ï·&÷gE]/C2óíeJÆxNÌj<(DºÔ˜ìiRúº¶  àó;€jß %i˜Ð›¸˜Gã=;uÄÚ¦±÷O^ý¸3xc fØpyÚŸÀ2ŒJÁó2OÄaš{Æ{¸ÉTd\¸‡UzêÒ*(r­ªsY ®*"`Dýi+Õž1¯²zľHܱ¯03øÄé1C§ù¼eÞ¼˜¡¨G­áìë|"„;s+¶ß2õV1s¸ò-•×a)îî5ª|Uå_ê–³¼?{êÍ8Ž#$7Š)¦q ’á|5Œ»æR_:·dÛs¤øÆ–µ™¡Øc©{%S¸ìS\¤ù™¨Û€Ñ„¼“‹ )N½µZ|Û¡æZ=ØoM›¸ýî*0/ò"öO'nÔÏ·§Qôf'½Õ_!ÕÜù|ôÉFV~eYz …ºûè]³HÛ!Õ²IôE`.VÆ-¼¯b¦;Ð)“¸mýР³Ëé@™ñ9˜ÿ3=bzú½xQ9’‡e, ARùˆ˜ùÜBjºe]ªDÄ(”†Â$r¿Ì§|ΨiÌœg"ú$¬ZÎÈ8Ô2,Ê@æ­¶Æa ±3ù@ˆè»HõCC6Þ¸¹íkF#äkëÖ2BØl+L‹–­PêRd1=¹Ïq ©RÔJ“ä"CôÀZPõñQ€Ïõ[21ѳÕ}§™®úÛ³?näî*”WÝ\íðx>q0Bƺòryêv#~KtqÒä>è™>”î5aõ±À£þñ“õöëL=‹Ë,“—º½íÞ·7Ö}{H{Òì{¦Æñ£€1¢d{B(¨°eüÆhÚ‹rÚwªcÙiàÚºœä0º§ÝP6Úk¬|#•BxÂ[>x}±†wZyääø“€›;ä{u¹4Ü2ó—žÈš³½rK‡ËÃiHÍ~°O›*©<tçµ+ílòõ»~çyº^$öiøÛ%åýB¥Ÿ±Ñº %}1p‘çäÍ® ÖѼ´:çdÁMFE›?,2 añð²g¹Êùl˜“¹/ÁòXdkt—\/†ﮌ÷gžu²L1ìÕÞü±½PÉŸ&}Òt·ð¾·Û.ên¶É§PIw6ÛNì2ƒöÅ/Ü¥º¹j ŸW¯gÉ’b÷—½t±n¸‰85—Õ,ô—[PÞ ‘Ñ=¼Öဠa~àAë`Á#˾p‡ïãƒÎ¡1×r?ÑsäZÜ9Ö;@Èq¬úzI¢²ÏZ˹uqqcõŽãã•êá’Þ>¡ ô«ÙBÔ¦«[Î è¼SWWWëÛ;5Ô¸`hsáE y›®Y†üÑÈñ7ÑG§™î¬pƒšÇ©›Ù±¸«åÔÂîÇ×3§ztªNÝÁµý>«@‘Ò…Ø¡4xÿ£ÈM+!€Ë_úîlW>^¨ÛѺ%Lbt‚¦a'ïÉ!7Í•‡yˆñ5Äú.ãl¼ë‘0\…ˆ=oþÈô¤¥f/}u­èÜïÏzçb@%#y[»Kž0 µâÛrÝR¬â¯žõ|ðYeå³%zjÑIO‹é¡ÁŽ Žç2T ïÃæòä¶åEÁ¼äÖ¢• ¤Û³L³Xœ|:AêL½ ÙŸJò¥•Ÿ¬f]òtï ¯Q¹\¨R0wÅ€#QÌèô=5î³5%«ŒVw^ܧ¼§xßólYs(ŠxëfyZ.rKoèè´5ÖGx xs5Õ Ÿ)­|ÕÅjÒ¾‡ª÷1Ö÷ H¦Aµ·NÔžëç?à|ô´¢ÐäAfê“s}ö6­ñ¨(þªöi‹Nˆ¥°Š'ý”æÈȘ£Ý íäŠ/Ù}“ÇBC0)n÷ì˾´Ý,õÖ¦Â$ºTóǫêÌ ÔƵ6õÁ€fŸðAC‹©zR¢Çªå¯3Ô•ŽLäÜðý¦2[¨ô—9UeÚÂz£ñNN Õ´æõëïë6X6ãj ÛnÇ„(Óø/OC ·ïÎd¤Å_†^³»ùUV½Ñän¿Z]â° 2$Ä# Ã_ ¶*¡XÓq…Ù#½4%D“o7y¯nwk½5 ÈÓ™Y•›K|X¡sdýUÊŒ^šŠÂ›5)’<ëºùšôõEÖÂØ2sÊD!ýU i¹6ãâ€Ð(š]œSëgá)2Sæqßo\¥ˆ5¼Œ ñ ÑAËúÉÔDñ­‡:(átÞ·!é@÷3*xÖ¹›ÎûKÓ/¯YœÍ 1i‡bï„ê§rI Ñdا^jþÒZN·§²H¿ðâeÿT/}ñÎ(=£Ç»cäàò‹Òýz¹.Íð6áUvq¡Z ìö ÿ;-ƒ™ =ûðLÕ”ÌNè!êÓò^¸/RÓzu®’mÔçR\oI(èA~zg$XŒâ Ètm¤¢ž¿š¢äEõÓ——Ìqõ&¨°œgo*ü¶> ÷¥âÄ+‰]ªy:­™àõ‘‹r$FgÆsÖ&6vÅÜO_R«Ü˜¿“Ÿ¹MRXƒ§ãýa…Ç…]¾¾ 9œ(BîåZ[÷`šÑEêÍ'3ĸ‘ Å?Ixz@hhÙI;™…Ô½ërk“à;wØV_;è)å<éKé V²ƒH+àGà7§ûöŽ6ÒÑå-jŽT”e³e«ôé?’P•CÒMô¹è“I®=eÏívJUŒ{?Þ¿ ¿Ÿp"­hc¨W‘*úµ‹Oñ†h}¸¢ ‡ãÅŠÆéö[=<Èw»×D¬Y/Wì‚%© „ûJ>èÔCBòåæ»‡¶§k¯±ï:oàXÇ•:t^}jÛ®²Ý¹;u>–1ÀK¾‹fꩬµœÈ«‹¡×,ü^¡'_Ì©“¬¶ü‰]Ú8ï5kÅÐ"ì°>Õ{¤cªJ= û1ÎïªñAÄLRšTñ@>yÞ×t"ŠŽnªúÑZèRUÚÈ^Ö°y²Ÿô†¨`pÈ’zF;ι;Áâ&u=ï):Nn¦ñÍò!|ßYʩڼœ{‹ä>{ĆJªìXT`“´.Y?±÷7ÎsÖÅcË=ð<ëÏaì8vµL—‡+Ux~qhoßY)/Gƒd¯{~¶TÏÙS+Ÿ8ðouëEYÏÃk|ßs‹û­‹›?W"ïRÖbÑçæò8ÉûXCKM³Gz,·ƒïïăT¿~b±!Sõ®&\ÓËõž®aj¹æMLäñÁ¸yùb¸°Dåpë4÷še®¿ßDÊ,.TýÖuV,ÓÑPa׎§?R> I溟™l×ĂìErÍ–Ÿüfÿ“Õ ‚_¯zÕ¥Áwý$*àl\¾‰­×å+¢_N't,Ä}Ûáµ±m…Õ3†½Éž|Æíµ?HÍ&ûVô°á!moû›Ùgit¼³Ù‚/ô[jõÞ\ˆ–÷4ù¾ú¸CÀcÐOpâ£è4™¼Ö~etÕ–ŸË>W Ïu88õ—n©ËÒð›µR™»Þ=²ëîYîªCüBO¾Âõò±hz¼w8mt¶ÙÇɺÇûQØÝpð|yáe%;H£Q– $E윿o¡Uv€ª®¥ìKÖû-‡ƒç 'µFð›.ý§€$z|oz,òåµûœB”ZþVºT…q[—ëg4*ÛøëS‘i Z$%/•`¨&xÐô}±Ô4ƒÉ‚ÈT³ì(fîU*;Y—Yëãp½«/SÉ·ùôü¿µ ›]ÀiU\—+ïæç'(w·ev$n¦YÐe7œž¿:ØPC k¬¨Æ¥ çÉ]ŽÆe¯’XÛ£„t…Pä¥JÌ'Ãu/ªv×Uõï°d,¨Ý7´r];fî,æô1ÈL°¼‘7åvX;ƒûuw³‚¢'•ß¹Ød }Áz«àÊ€Û.˜FåóDçíXü¶j—ãy²¨w›îi{ËözrIÐͼ|þ.ó )Žé{¡yòazj¬¸E¿›a8Âb5䈅!k>ƒm¯4øi¥û#Ö…ó³6ÍBÄ‘c¹ò—œEOÖä¨À³«ÚV(bï½ÜÊ»ÁƤ±»•Øðü™ªÖî—(«%PØ‹iz$W¨Ìœ ¿O°èäÃ¥%뜡!²*Ä7’C÷îëD38Þ±ph4¯US\™”éóQó¢ndZÎY0àö,몊8ÓãЯ:ˆ'?2ñåny7óËC“nuÙ%ržh\K0×Ô.©­µ©õª&7å»ö,~ß|2¤w4„ï´Ú° ¹Õ¶#¦Á/] ²&×™—t•¾ ÐÿxT-¨91äü=­‡ú†÷^%¡KzM1Ö…¤»m?«„k"Éš—2vTxÌÄJýë•aÇbãÁñ¤TS VSëâŽë”û4óéã÷ï{Å^Â+Zî/M ©3æW»+XPtå×Gˆ¾|2£-H‹í“¤á¤|†ˆ·€z#»"o½OM:dbaØHˆV®tÛèÛüRÜ_àToš× sç1[—ŠÆ¼ß—xÅ5åàõ}ÿ}pêCzfv1+ù’gžïsô6·\š‹³t_ßíD¤^t×èÜÌ%7=ñ…=aV ¡?4¡â}|?h‡øÚÝíiƒ,óˆؼôî.×=,ÉÿY:÷œò~sp³H5…±¢ ‰¸…êj=§£Aÿ )óz endstream endobj 536 0 obj << /Length1 2144 /Length2 16145 /Length3 0 /Length 17449 /Filter /FlateDecode >> stream xÚŒöt¤ÛÖ Ƕ“*騶mÛªØvº“tØIǶmÛ¶m§c£;7çì}¾ÿãÞQcT½ÏÔšÏÄz‹ŒXQ…NÈÔÞ(noçBÇDÏÈ ‘S•bb02²Ð322Ñ‘©ZºØÿ#‡#S:9[ÚÛqÿËBÄ häò!5rù0”³·H»Ú˜XLìÜLÜŒŒfFF®ÿÚ;qDÜ,Mrôi{; 3™ˆ½ƒ§“¥¹…ËÇ9ÿyPšP˜¸¸8hÿtÙ,MŒìrF.@ÛMŒl*ö&–@Ïÿ AÉkáââÀÍÀàîîNodëLoïdÎOE p·t±(Nn@SÀ”òF¶À¿©ÑÑT-,ÿR¨Ø›¹¸9K ó‡‹«)Ð ðq:@EJ à´ûËXö/ZÀßÅ0Ñ3ý7ÜßÞ²´ûÓÙÈÄÄÞÖÁÈÎÓÒÎ`fi(ˆËÒ»x¸ÐŒìLÿ04²q¶ÿð7r3²´12þ0ø3u#€¸ÀèƒáßüœMœ,\œé-mþàÈðG˜2‹Ù™ŠØÛÚí\œáþÈOÔÒ hòQwO†¿›kmgïnçýdfigjö SW5;KGW ”èß6"¸dæ@###'3'èz˜X0üq€ª§ðO%Óâ¾Þö³@_K3àÇœ·³‘àâä ôõþ·âÀÔÒÄ` 4·´ƒû'ú‡höþè¿“¥@‡ñcü˜Œ|þû¤÷1a¦öv6žÿ˜ÿÙbeuQ!1š¿)ÿW),lïð¦caÐ1³1˜˜˜Y¾ÿGÑÈòï<þå+egfàú+Ý:ý'e·¿g€òï¡üo,yûÉ(ÿt]F6F“/¦ÿÏãþ§Ëÿ¿)ÿ#Êÿë ÿߌÄ]mlþÔSþeðÿ£7²µ´ñüÛâcr]]>¶@Îþcìþ¯©ð¯Õ•šZºÚþ_­”‹ÑÇ6Ù™L4+=#ë_rKgqK ©¢¥‹‰Å_Só—\í}³±´*Ú;[þqÃ|x12þÝÇ’™XÜ"Σù§ ø±Cÿ{®˜‰½éËÆÌÆ0rr2ò„ûèõbx3}l¥)ÐãÏa0ÐÛÙ»|¸>8úÌìàþh,;€AèÑŸˆƒ À ñb0Hýƒ>,eþAœùÿ"Næ)ü/ââ0ýƒ>,ÿA\“ÿ"VÖô±ÎÿXÿQÓÁŒ€ÿ…ì G×aù„å#Çz6F¶ÿòùÈÆìø²ü/dcùºý“í½½«Ó¿ü?LÌÿ?’´ø'å2Xx:X|ÜÿX|È,ÿ?Ûü ~PþWv+Êð/ÛG­ì>:ý/ýGûŽûp¶ÿõGºÿ¨?‚9|\åv6@3—¤LKÿÚÁÿŠÙ?Ä›gÿ¯ú~¼ÉÿéÎGpGW{ ©±ÍÿDdaýGñ¿A™˜>Tÿ*ÓG-œÿ¡÷¡tþ¸Ðþ›Â]g#g‹9|dõO¸‹‚ÁÅ ø¯þ|Ptq·ÿ—ÃG ×Áj»ý ~Ìý_Íÿˆçù/øAÐëŸl>\½€NÅþŸµ2quú(ŸËŸ÷ßÇÎýÿùB=€&p+‹ö&îeÇ“1œÌ‘í÷Šá¼FSܵ}¥4vWøÌ“!µ?}#y³)¥lÞ,9´ >.²Mrµ +”åaL±«ÏCÝ%Zܾ’ ZàÅÂFQÚ[V&Î' ß¿ +>ó3¨–> UÆG¶fd&V_Õ9!c.¥€v, ½QQåÖ{‰iÆv,"Ð)Ê’V¸ƒ`Ï_9$3ÚjÉÆ`#`Ê¥F-¿½YžŒ9üú•ðìs€z>¾ûÔŸ—efÒø+C;CË0Z,ÃHÍîPŸéK¶ý"Óí`¿ÆX„Dhÿ"\oXf‚›,‰ƒ¸ÊK"]qN®ùQcˆ¯ËMÛŽ 7.yBÉ´ÖÜ}†a˜\ ÏZ®3ꌥÙܯ–=ü±½÷ :^°P¯·šŸ–ïi‰6WIïßÔjÆÍbÂáË|§r#õMh¿ –'x‡Ö±÷ú]n „K«tÕ–ö׹ݓÆ×ÝYÖ‘^×*|‡ËM%ÊR_QŠ8Ù8†a¹)+ga/uÍ-›4ôE«uõË«mÙ%¬ØËKäºï:è«ùJVš ÏqA€%4ϘoUVþÅ’»æ+gâkØ{““ÿëkŠDI•.ƒÅŒ“Þ¢G×gÐ Kl+ߘéÒç¬ý~xÄ¡®Ó’iõ½ÊÆ’<­bþ+ê¢ï±¬“i`c†Ü柔ÌSóŒ ]ä·‡¹HZ>€ŠR_“•¶§£ízzêæŠ¹@òÅP¼=I¢3”„Üï®g -³ñh“ZSó@ÙÙÙ¸£T¾ 8}fnºý‹Es«wÞ90ê†U\û}ël¹¿ç·:Ÿ‚6§ßøäþN$`íæ‰5„ò ÛÁ-VW Õòžtàoš§åû ∣Ò"*ÏXz}^t˜™Ó¬÷y}syuîëÓ IøõÊ|Œ¢+Rúèçt‘5ìþÙ'S§}Ôn­¯^–ø Q<}"Ê×RÏØÒªµç2`gÑ —JVB6|hü§§ù7G“‚Ü"õ‚ä¦3ßÍ¡~ŵ1)ŠßÊbë­C௄øm_@íˆ.ò|-Ûº¾Û8JRäÇò‡ƒ1¿Ü#%vÁÔ® )LÙÄ1—ªò?ǽ@!è´}Kuî&²ÏE€i}u¹y=1Ú—!ø2éŸÄí»‚ÒÁÅ ·¢gvÞ¥¹bcv“G÷">é³ èÓÀ 1Ýà+ & W30ÿæ¨`ž¤´•œ2è'Í™ª #Àè æK{Õ5KÆ3þpÍØÇüR3­Ò´fÿAËšÂœŠ c´ô„[·:À9K+ÞI¢ƒ8¡ÅÀU³àÔgj’q\oÔ`îUZ¹e;•L*ªÇ Ÿ[ž¥|Ô(v§xW­aQß²<Ñá¥'Ž‚)µœÓåµVw|(;éC""Víî+|˜>ÐQpRÉXÉBîpëöU‰ÛuH&Ù½ãŽÆNdÞÏ­ëaÑÅ$³.€;ɨŽÑ3€HW ‡ó¢Cà|PÛs55U…å‡m:ÖØÓëPÈg7*%Jy³ÏÇßí2cötÅ+Gží- /iö–vŒ”™äãÖÌ¿(‹=‡ˆŒJ™lÔxƒsŪ$;:–Èö3­ÁfLL‰N„qÂ9Q¦iþ]ôkÅMƒnyŸ2 öæ‹)?±ÖÚdÔW›\¨R-Ôdƒú‚iÝN%(ÌF/Íoá£u0̪g \ò@©ëË€u|©{‡ ¡û"t ê–@­duß1ê§›äüjT5ëb æE òƒHëB u^ÒUó"Ù³åF×_w&^\—úõsžo5”<å9Ì5ëç§wãtËO~Øz(÷_'N*ŠÈ•–u:Óf„äô2Í4=ô#,[žR¯ìÔø_.¿æ®“6ÿ¢œéVˆÁ L™ Ç@4b’… ¯wo·4 þ¶)YQöûäñ³H$¡96t¥Ùœj\­˜D°ÿk60MÊU #Ð^@ü“9ü[J3WiÌz$â/wÓZN}¤‹9‡€Ë¬[Ùýî'ŒÎ8 î3+KØtÑüNk|ú§ ›óª^dTÔ„’:†²§õTŠJfE=^ػǹšù'8Ý~‘·å/ÛÜy ;ßÓ)|èæœ<¿a.²÷ÆD‹â‰€¨¯baSµ,«IH…¹ø OýŒ¹l vD­%_Ü*øP›¡@ßi˜ÁÆý¶/§ºœF¨x¤yZRgB·¥™Ng=õ虞aö@(€¹ß)Ž@t‹OÑä:\¸ñ|5ïÞ<§± 8uŠgYĪ-¡ÆpqÑ”ùäª .K” ¹ˆr0V\0 <Ï z5®h‹’Ño´ÙÿÝ¥SaÌ5Ú¼ù,¯\âÔCÆ(ƒ·}9D¿×õÓ˜³_57EÄ;œVÓõœ ‚Œ®s0 m¢¹õN?@F UjÍ«¥8keßìy§Öù ¤‹¢$EÜÒ]‚œyÔ¸W”Wóòý´ääc¸Ûü\À <¿fkð Χyò=·N5–›Çœ–Þh õ¶v¬1!ó³ÿU‹­¤U“¯ã¯¶2Ef,Ÿ #Ο#~¡cãÖµŠ;¬öÏ…gG!(?ñwùøP1#aoS ÜÒæcBn#QnËF¶Ö&8ŸÔØtZ æNá{f¨Nî€P|¶£;/£Üᅳ™æ#QŒ›ÀE ¹~aûމ†€/vU0>š5íÛå*¯vK=„:Ô{ZªŒ{±9ãêTLoÞw–áïˆJÒêìQ;ù)üö.oläÌ××g¹XíMÚS¤¿»ä”¸§ÚÇ»u/º'Ý ÚnÝ­šù&ß· dƒ KÝûäg›¡‚|Å×M5y`ZbFÃ/Ü#†/'ÉZäŠMú²ýÏr/ð¯ ýeh0ÓÒ˜7ËÌÌP•¢‚Pz !!HàìŽ1d‘—ìƒ)Ü#àaÊõ©5Ðsãj‹ ÒCÃì¯_Ãwâ‘m.˜q©êÉè/˜4Ëõß;Í祅Âÿz:í$®5¯GüBaÖ'àXçÞæ²”.“«½ðêòxO9–MËûäÕ®V2­Wòó€WÄtW$$ôaaqB>ÈPvcu]°‰ƒëÔ ÞöÎHÙ‰©xkÏéí­]P$„^?£ Ñ¥qç]YŸ±08bBÆíÒ{¡ Ù\¸î•da«èñRÔì‰x{‹Ï'"¶Di |ûí:޲ V'¼Ï¯X5ÒÙÐÊ?e4κLÞá §Žjùö!Ú@O „0»±'Áë”(Aõ’–T½d† ÕjâbM{«áîÇ; Á»?:ÛnçVS‘KИ’ãxåùJʬ„µÉäÃÎ…w~¬O‘rë3Ø/YPøcìA= 7!‹cÒAdJ¶O.~Î3!NNûSd¦±§|¤êÒá°°•Q…a!7ˆ¤øì­¶°½–ukg>7ãÍ©Ý2ï«Ùâ:~rr/|)hÌôûj$õ•K5¡ÈKõ<š ¹XÒaQßX„ö{‰û·ã Ÿ™¬ò €æœjÛ%"C_Ìð¡©´éd]Ê-mÿÓÇå3T™ö:ç¶Q¯lfçëÈâß§¬4='þaÜüBvþ/ª ‹+ÍäšïQó#9kªQ´‚ªßxÜËà?–Ìãf]T—z ·ÏmcMzaÀ7¬cMø¼†®îöŸ%  I±XûQ_á¦"¶Ñ$W$ôÓ(\`4Þ5~ÍŒ¾Mºâ³Q€Cãp½ÉGÖ“ÏWù®6}Π†Y‡[äx æ; aðyi)ÐdNÿ2?¦ÕMì.”ôó“õð…ª¯ ÊL@Pde‡µ"§nY ¿@ÙñmÅ·qÀ*󆆣.™.]Dþ-‚HÒ¤ù•‘ð¥åóYyD¶^q¾Mª°AâÏKœ @Ÿ‘剸yóš(ùÊE%°fôûun¼œâŒ"Èô¸5]5¡·®(HS^AìÑúÊ+¸õ ¹ìÍI6/—ß`r¶—‰ –ƒ¿;¤C—–kôÎÜ-m{ŽûdÇŠrvL åšf²­ùc%¥*àEÎøU5¯§ZW ùë’Wd’S0faqzþh$ßv@Ù¢i¸Ä¦gјUû¡Ç›‡EꯢZt‚ëÐ+çžofAÌŸùBx¯·ë˜eYõ»À;ŠìÀô#9·1X¾u_•%ï>òz6yœ™¼©6…äPzürvÈ[5Ÿ˜îD=Ql˜@-ù„, kf.µ§Lœz–;ùÄ÷¶‰Ó–9à”€èûm¿ü†¾h*)Érœ]¢¯´ÝÖ@rô¦ cb;Ÿ$û~¾ú ‘ülfuùÎj‚Ú# )°Sífÿ3¥Ï†z.{r0òLÙþ8Œó9²êM Åò™¹¾wõz«öÛ\»Ÿ¸Q¬êq.”P£ôDÕê>­Ý㧨ö¼œsÜRŸ£ýÁ]Ì{>),M”9Ž)5¿ŽŠ{ƒHåKŠaðu±rWÉÁ\ÉKÙÁ)ÓwÈU€jG¬=°Ï¾õâÆéÖ¿ÕæÄ^Û¾ D—ŋ´oj5&¢&ULõeSÞë'EbXR+Ôœ”Ý %@èìIø›—J¨åézÒ7Ïû@H5Xíþl [ð™rÙ¡‹÷£¥k(EÛª¯¨P—k¥‚v´žþ½ø¬‹XÎE £Üòi Ø'2šFÌŸ_à`¢À]]Ü)ß–)!èµõ{ãÇK»Hümƒ«ÁèO´â›v·žzf’¿ôyä‘<%Õb!6>“P.¼»4C]Ò—Œ})é&žJ³tóÈŒÇ%ðö?Eð¹Û@1ö‰˜îÄ©€GijKá©ÙKà@·î‰‹ÏßÏx—9SaºéHÞ—6âjðÚÐèv΋Ÿ2­†„Ñ”|AK×5]ˈµêô§bñX'³ûEaéÄô—Q(z©²UÆÐÝbs°ÄTðcãŸ6ÔZcÛO Á›éåúµÛ¼ÔÇ8R_aÍ)ˆôV5‚ðí¡šÉ1Qh¤7nLô,¬å„U^¸Ôæ¦{ÏÓyÚKÏ¡¼e¸(ž¤ *‘^ wo팟jì?ìidÉ&6ø~U?2ÉÛêÜFQ]}Ë«º‹i•v«Å«”;%lÒ!»žÖ-·ñ2<<ßÎŒ=¦ÍÔ°e£h *=æ "«­Ó±W×NVZZi¤°ê\®ˆ5ÌpÝ/šl…äÇÛ¿ÈîÜíµ€ÿÒ^К‘]S¸.Ìô”.WŠ£ÂïVg!åÕj· U ¬†˜ÆEJ¿ z¯Ã²Óš æîŽùÁ¸Ì·N0G·;´s$Ço,P+U«ðÕaónWAºøê1ÿ¡î÷Q¤SÒüœ(xwð'¡uËofÕˆ Ú¥B­#X©–ד :a±HéNr§vmcX¬Ñj•Ažy?Gq.“áÏO…e&&I¸­‹)¦²CùÆŒƒ‰c]¨©›ÚKWµÊÒEC~êy‰Rxñ+¸{Þ<"@)M[*múr{îb ùn®˜mÒ­.D$½²ÄÞû„P0°¶4dh ÿ„9EƒÀN†'©ºdP‰Èî]ÿJüŒ™5„€/7!tŸ2ÏSõ¸<î‹dü¾Ç‚Ø™ËÀ¼ö#Ô™ŠJ½xâÁò¡$q3" Sy`ù@9…38X9„ÿ#¦ù˜Èœ•h¦–Õ†¡g@SœfÚGÊÌ8È;ÇbA,'4@-PÇŽ6͇S°J$›»]xT}„„Z> @{¾ih$É<¾j“Ú°^àm-:£@18\^$¨-óæ–JvALt¥w}öOEeÄÏEÁ8 ¶T7Z•aåõîõ‹óðÌÀý@7QÄC£K™€Ha¢™8vÑCêì:½Ñy"¥ñò¨¨qÏ= þx”X‰ÞŠÙyóŒÖù@樓ƯX¦›´ÈÍÄ£-kÁÎlz.¶›gwÞ>%<‰ ¸¿Ïï”_f*W5ƒã&Åý}¸ŸÉ¨ %{nyʹO/El%SpXDÛÊs?õÚÆ½#MQ¾B΋z÷¯Öà~ÅÑŸÙÏôGåG’œ;ï4é_•ŹÚ\³$:qŽ›¹Ú jLÀ© ›ªÒFãb—Ñ–³ø”h+ö(á ™9Ÿý°—mÀÓ†·ïJ€Íàb@Þß^[©»”ÁŸþÞ‰“÷Û¬Ôý“±¿áû~êøˆ¸ó‘Äc£èê|†÷¾×t6V;¯Ã…OÜWþlØ3ö&úxß;ˆÖ#v0­äî wÞ!­Â¯Y4»•±!^ùï~‹e#3CÑ¥ò6lkP5ÃØðøJi‘ ý-s*Ì%PóB îtH¸k–7§úͺíå%ú3†\Já¯3@À9er×…ù;^s‚“ÞŒÁ°ßr.X}å„€îd4éAkäPs¹ÛÈžú§­§vÎåÀ”k «¸ ¬槪ö”Édþ|ãµÞŒ×b$Τà숩¯g±z¿™²ÑÀ“QO»4ZP#ßø&/ÛÊí½ÂmçÔ&??z?#.;ãíõçBÉ~™åI¡ówõœ`OÂ¥rÃJ=/âgÈYgŽ“~µÉSLåÞŽUÜÛÍ&kò´ r8MèÄø%Ñ(8NðBÖïÈÂp¡¨?"Ò"|‹suø&ɲèWrFÒøê½OÂß™‹i_Éé÷{Êõÿ`£­…Ðļ:ôènà%aˆùÝÛÏ- ¬;Èë$IÙ¾Åq„ ” ÛžIõØÕ Ÿø›«ú…ƒN_-Û@C„-³t‰gutMÚ' gF‡îÌ^8úsMÏ()9^͓ڤþQl"¯-ÔºöÅ1ßÑþNpmró„(1?¡[/X•öbŠŽ’Î•Ž¢$ 'kk®ÌxHK–c‰)EÃáqBÝÏ%î»3&K“-¥Qˆ Ð.°KÐ*ûÙ{”ŽcÐ\ªžiÑóÞy\¸9†,ä—>w  —†qk#TûàDb‚Êß­úËÉ#³•uÜ0«v0Ôº­ïˆÝexú³"x—ý\w,dŽ÷‚Ìvô7Çál¹G£&´_*­Ó«*Ÿ ²•LQ½ë­ŠT;…f‚Ó2„jaÌ€S@*÷VÛ¡yjÁ´wÐW¹kŸDÛOY8ÓóÄ!bxN»Gâ£~ÌÚePGç¦@ k[Æü;ýd…Óú{\C(‹ýˆí¡‚èÅalaɉ‘’ª ÅÆº8¶_ðÇíÜ51X6ŸŠvË­Imý×Hn£–A¥H ¤6­ðSðxBfdNZM¾™j•­²ÿ²zúYM—yŽK*Ý Ö¼È#³¼ÐÑàYšgìæ/¾Ï׬Ül”¡>Ä|Rß ™¼]lƒÆ¶5·¦á7¨|:|S~kÁNM gûØ ýE !;Õ Áþn—µhÞ‹¡o.uÖ`U$XP{KfÏÎĨŽ,,Ešÿâ¨ïS‡Ž›$!½ |Î^m[þ™Êáyð[&`8ähÉ'ú~ù<‹° üÎy^Á‰Í¯ì©­‹š+BQ'>~M˜õûgÏ+ˆª¯Ã·êLõ÷Ò©Š;éì³É…V³)D xêYãõ}2ÃïE=(ö+TÜ)=ï/Ò‰ÙÁ;TŒ&šæv˜¶FPæGW¼òÆy>âÄëi\Y®…D¼d²D{“×±W7ïâq47qˆ6ÛWVr¹³L -SláJ[²Ý8>sþU-:Gy¦&h£y"ëqªŠá× aWÙ8[ËÄÇP†¶N×*þÚÞ;%–Ñ48ï>mÖ¼WM•1jƒu­õåÃn?gCibÞãÛNÁ$¿w¡d#Añ <žMm®"‚åºë©¸tt§kЋ•YR‚w MÓÍu5†õÑã/¾[pmÁ~ÙþŒ…DmúÎŽÉçìNô¥~í¶Ë:ïÀS·ØýjCÚyNŸ4ö®KnZŸú}ÐG&ˆNžó·S;)cYŒèå5t½PV¿ósRªÀo…HG°›ž´Ë,]t ÊÏøùÚÆÉ‚‘yJøI9)‹LG¨Ö¤åC2Ë'½è%J“Ø4(™ÜQ÷Y`InzüƒW fšŠÌÖ£ºÕCªÈ¬ ~¬^½é¿‹OÓØðá¼bÖÌ8ࡲ~&ÊúD\Uïrˆ·<•|ßçm3_÷ïëŸMpV½É[2CQXï$"'Æ—óa‹ÕœÑ½O³Áe¬ÐSÛòºŸõÒŽX–Õ%´¯ n;H=ÁŸ”ÙP`ûÌ¥z¯[8ÈwnD;V(ÚFcÏ!zS´œ0ìâ=CoBŸc˜öxªŒ=òÅ«#€Zhe)ŠTo§ÓVi˜²Ü»ñ;>Å w9yKÇB7¬YHäµV²Ô”WøaŠfÔO'O[äu±êoççQ Rj|?·qû‡¨ …o44ìtD›‡H“ïeaò3Ý=P•Å‘UN Þà¡yŒµ_qb~$)À}ÖÆ?¦\ÔíþdŸ¦†PÓ„Šk‹;Ô#Ã̆êvgh%mÖ¹`t—8|N£€¤Öçšh¥¯4 ±Ó‡Ù·oÊe;C @ª!ë;Ã>¤Y† +½XÌæ¾›m\.À¯DAôX4üXu,õSç¤P¦œLËkÑÁ$Ü‹¦K ¬È÷ !¼BùÙ_å=23O·ž:]~Üð€ðÞôô{Ü•Ü vgºƒÝ™q(ö"‹=cºðýs™EÙíó¼r‡-'_£ôœ˜N–}øäg¡¦kè.èf 2_pá +Nü±š†uKh5ÏCF×›³m1H˶FY÷1\2¥Þ#°Þu›ï7;+Rée5‹×` óD/ç:VºëŸîwÏjçIr2ê:׌ueržæUHw{~°*M쮋”¼›Â/ŒçZÀj[$U¦‘f/Înl;yÕ³¼Z:<;Õx¨õ›–͉Ïg§ØãHC®äL¯0žêkGp¢)ÁDÝå¬I¨C<¶îøö²Ýmk¢sUc/Áă0âOÉÖð©!9`ðmqb«i§´`·-{ø“ŒB°m% šú1®×šZ¤¹`­u1Zºél¨¢'Dnù…%æ¨K]–¹|̲Žs¡¦3Ù$A9”|4xªý>è÷ Ïø¾èx],璉īu =[_šš]d·½¶lt‡áU¦ ~ó½õòê@s]­ô’ŽËoÙÁ7|Î6–šÍô`=¤¬"‰WùlB°1çy'(PÉ1†mån+Ù­ã[]’jÊcûÚOô¥&Ýòãô!-a»ræ­Ò…÷&5¿KËÝÕÀh.”áiA·×lðá9c׿>»êíRÛb. ×¹ÈX€µÞ;k_«B‹÷øºÊ!I9°^4¯n+³sä÷3êN¬ ¶4æËº\Mä>M¡U„¥Ì œËôc`É´ÅÕwAßû„Ê8JZÄècUdËÜ=Úµhqwˆ÷¸"½.™KŽW}%ñ‹6°3;˜Vû¼Å)@÷}' ñµ!{¶LÁ«4øtFÕ#ôŠdí2æ3XmÒ“øë(ͼ JB"å1 §çSAK鬣ÏqÖWí|Sîø±ÂûB>Z¥Àöö/zµ©ÕoÊ2¼%Bþâ:.²´í”<‘·Mé‘ÍÈLã¼/—Þ|¼”FPw§¥ÓJœÐ>ž%$€i:qòQpã³Ñ¾ý/gìûWe‡fzÌ;dHò£^±S UìH³î"ÊÆÉ¨T}=›«L%œ$UJC#6’¼—ýcq̬GðN¦®õ$L¯an‰^íöÀGH”ó'Ù`cVA'ÇoíÈ”µ5,3¸+«l¥ëF’#WÝfi]kz¯y-ÉZPÿQM̶ /Q°GׄÇe”ÈkO+×%zÂÂaXÖ'<éCoÝ­0q_É,5L 6•„5åt÷9ÚŽý‘¦Œ5ÀjðA* s¬‰jž¿ÝîWbç~×»d_À övžù5F8Ÿz§‘Û>à6üŽtµ=Ó¤ ²Iɼ“µÙšÀ”Z¹:eH]IPÓ„ÌgGK0›kŽ×ö •V`Cr±9âÃÄ)z1=Zé~QÑ3d†-pßÒjñ•­®P¢>…O[ØfT"$z^Že|%²°´¹‰[ˈÚÕ³méÚ¶Q«qàÉôA `K€/iƒFƒ £låkpäRžçMãœy…åƒ6>”öë8®¤W¢Ûá·M¤|F^rHš¬ç‚‘²iölêe2#Ô’Éñï²·zíú†J y¹¾[ߤo[YŸI§ÚKúªÉËc(=ö<üüW%[9©§ˆÉaë¨A9âƒ\6ô“ìZG9OK„ùÍñ/R½:G`{@Ó;.LÏðüEe:9zZ‹â³ýu«5½–c¿n¯Ä#Ý»c"@óRP}‡?¼œ§Zz,á)l»[upç·âl­óƒc©-¿5ÃÏôß8Ûþ4®;¼b‡æÆ®óÄOÂ`¿ø¯|zÁïB¢Óë¸Ìã—bŽ%Ç ü¼YéC‰‡Äc™÷z©²pسtÐzc¤€ñ°á6¡wÕzÁÀãÛeºç˜ÓZsH%G>?Ë õ1þ'7Íul#Ò¶¬ E˜,ÆÛþ \“oÃFÉBx&2"K‰úÈóºÕŒuüÑ=¶Õ••î¨JçþM ÚÝ2$+ÙƒzôZ ”sç¦Îaû 9M!¤ÅŽodJi õWޘ⺠ï!½4®õ•J훳êDð‡Ó`S> [šyÉpn}£hËû~þŠ4Ãñiîx^:Jøw“,HµX>3WoXUD€0fÙgÊ{îÓêRåsÅÌ›s½½(ÑA<õQ޾pßM¾r–¢Ô`&éÐdÂo'¤°ê £õ¤Ó É“–ûì‹éec¤í·a¥èwã‹GªþvèãÖÑYãòj 9´Õì|jÕ/š>“ ÑÙÛÂáäËígIÌ2ÚN‚Ñ%”Õüš îˆa³­Ýa_é$QÝûÍ_/( œœÃ(cR1¦ãßnŸI‡Zz„h‚7 ;9•—D½ù¶ *æ¶,\ûïQ çátq÷vÖYñkøÎ" si BaE›/lsK8ˆŠ“¦¯%*t¬ë^؇ãVöj—Ù@™kK’Eˆ´½}vŠ*ŠŠ [Bå" W vtð16&‡éÉ¿££}„6¢ÈÀØã87ÿ9iÏðdÈÞÌÖÚËpU‚:üY®äÙÞµò®‘¹5Þ’J‰kÉqYyÞéírÀ1Œd{{Í¢ÖúX÷+†ùšƒj\´=MÅá%"[8¯°î¼ä“¹^ŵ÷;¶ÑEðͺhi˜®?æXâCÒÛEü8©sR#›²UwP†¡ãkÅ… †Æ àòŠƒÀÒmö9oÀHÞßzºÛ” ¨­g†‚É8éâ5@‚'œ±½#»P]n°7'11I ŒuÆ<;G¤к¬Ï.oJíð9Ûb“ ç‡3Ã%KðÂ/Ú_ÏWÂøÒí:¶±0Ô<¼'›ËÉMÛî\p8© +:âù=U·¶püùÖ#«Åå—æcÄSj…Î -íß\õá*õÌž]=þÅáQüÓ³€û0V"jz» ~ˆ,Å[ù ÁÄoÔˆ¸Õ6@7 a«vUìö¨¾dŽ*Ž×9Ãz½kÊsyv5HúÃ#S !à: aÛ¡ÁUdG®¥.búöÆLÍ(q”£J­’pF­Ç*¬°LªÂühÖ±Ñ2?Qy‡|`Ä_²Êáõ)«ñÛ…¼“x ÔAGõ| IâI¯µA •ƒ"kÊÀ¸T•3Èae™| 7¼— Ÿãq1áº~`ܸ¬käüHv ”9¾¯ØZëEw¼±AF;–\š±/ò|z{Ä×Ý“¡¯ ‹og)E¯÷±vœXRÅ»w >¾!ħD %© JšT~-hÏiWŒ,¯ÀÓ¸õ´è.Kñ¯ŒPS-âëò˜ß³0¯"í=Ö¹&–th$s¾äð›+6˪ëéþØADcFŒcîé‘Rûo4ÖDLË8à:®ÓÑÅ™™¯-ú’ýjMü,v›Odt¹Y¬NŒ?»öˆà‡ˆ{¼áPrÒU¾7¬ pTÔ³/B7yµé€k{áÍå—¯zO#”Ðì“Hqòµ“ЈR›ïp«ž;ŠÒ17¤ó¾ñ<ñÎ |ºV³‘M•>œZS²i$Ð\Ù¦Ö£Zi)?:¦Z’öA*ŒB`¸µ,µ )ÐgÇL>Ÿ®åî.bt1R qg_O.ó4\qx‚Ûz„„"Eݦû‰f—iïøúCÍI~®ƒo«˜½áÇׂW¬¾O4æRrô‡.^]]TŠåÒÄ>4Û»SÁtwxU†,¿oùî-©gwÀŠ}¡ë¡Ýmàñ-©o(L(Ó‘,]oTW5ÎË„ê(hÊqsôZÒBŒŸÌvé4D(ß–ÁVÔ¶@ ¹á°}”ùpXW¡¡,¸ì³£û˜»'ÐäQÀ¿«2œ©€—}†¢•'†Le›ÜŠ‘Ô¿Ó¦ñ=f)H¼½Ÿ‚’¶µbC¢¤úØgšµcsÊAÈTæËM Ò‰Õ÷©OÃÙÍmF yb­± ‘ÀEBÍHÇÛ c±ÅÕÌO2R¦e¾8hʇӂ`{ko|NAÞ“¹8è gLï‘Ä ×¥š€Dõé±²äÏåÞXaÚÚÒöÖù÷è»»ö³^L¿޽q& ºM´ƒ9¦}ûGWáIRlã¬ÍÌËÎ#ê‹u®ò­÷)èõŸ› °5eÇÕ0~,Œå”v¡|”¢˜d_`ŒFÙ7Ï^•må¬%æÑq ­Î_rš9û°EñK¿í"we!ŽÈÇÇ7 ÂŒm 'àäê<˜ò«¤ˆ•"UÚúNêÛ›3³ C] ÌOUˆ"øªí8pÄÃÓ—qGxEÌÖ$—Ú¯ KΪT±©¦~©Çür¡gxð3(WN×ïXXÊ ê›$]ïî]chgc‚áñ­8Ä)ºPŒµ¤¿r«Î°LúF®Ý»q£õÀ8ðôè„գà †ø !¾ß½oú0“EæÊ$¥uÜr¸R](ƒˆ;:öâ¶Â¦ݨ'ËöeÀH¾òV¥…6?0…P?a+-žêö“IOæw昨Vq?C8lècigoê¡"NR]ƒJ ¢°4³¢¤Áv·Žµòï&¶þ£î(8rçjŸ¸×ßn*N8àýœO."À&=M¦3R–+(Eš0ʉES% dº:hdÏ»g^-}M@¥’á]×Sû{ã%(s 1N¢ÐšŒ’Ýa,ð¹ú½ˆ[L \-fD•m àSI«° ûF=ˆð^§k²ëëAŒA>aœM†ânG/;o”< *ÒŸˆ\vÓ/ ñfñ+s±ï]<ñP}™)ÊGï4¾ø9 63¼À Üí jyØ]¡í%Ú ƒiàBolhbrNbŽ=¸…f³oÓ3êV˜©ívùÁq<¸2Ù€JÒy’AòUˆï'ˆn›öC#Qsºkí~ìIx¨ÇsÇOì3Ç99=qeòz¿þ¡®¶Û¡ö©6Ïæå bóË…Hø`æ ³«?›SòhlÉû•Ó~ Öˆï—Õ˜þ,öÞWý¢m¼šl’,Cû. æS&ycRFôP;bGiª\v;Žß«Ô<õЧ×9Ù;*þø¼aç±lë­àåSŽ­¤FUyˆ,t£j«þMjŽ@FA:}ÆV:+€Ç"+ ÏAÔ¾??ƒyW›2\ÃÐ&ʸ¨ªÅþ‹É‡Ñgª^Ä=Í|ú^Ö6E8›…žó°3 2FÞÅw®jæ2oõ[Q,׆Î9ýвɑñvò¼ßÁR£æ‘ŽQ ñºhÕ…+1ýi^õÓú|\ûØxj‹ÅøÆÆ”¤¸`Ûæ^¢ñ§mø68(<eB}?åh¾È Pná¯P~à©´I4˜”í¾(†`ýlÌ0~ð‰dÕ·™~kEѶr|a>œQyl¯<‰3­¢”Þq”1 ¸?TÉFXBGFút[fªØÄ„k©À>Õÿ|ÌÑN5óþÀ €>‹"|ošpæÕ5óS·Í¤~yÒ|I²H+M$E#QH]Sý1&¨± ‚%Â×ëÓšp{ ­AEûv—‚/Ž?›Z†H¶Ûž áWhô‹5QÊGQž<¨*\H —xüõ# ÍÞ!ˆ¿½ôèÛ±àG®Ü‘ñ­â7Fyˬ’Ü:èþšme Ï{>ŠózN8u…Ïd_…º_Œþy–Q&Ž•.ÄÍ~ŒëG(sQšébq׸Ç\!òöDW@¦ëÆÈCy+XâGlSH„µˆyæín¿ñ3|G16%g=ªÎy²c^MšB½ ÉÒ£ŒB~ž°$•%ëÙ<š‹p šiíšó.ËF6ɹ-é;UÞ!]ðo…m‹ØT() Ùyèæ3Ù¡úI›úÖ’³¶ÀÑX~£ì‰£MÆ1ª¡oÎmô`“ŽÜ¯9âW>ó*'¤½OKyÙ›™^$J¦û6®9ÙIQ,—«%7‡NV‚iBž;7m¸ŒJÏŽÌÓÒ‚µ ú¢4¼iö:9ÌŠ¿V¶Á\³P5 ›¢Ÿ,çFùÞWÍè–º–ñÛ¡W™|ƒ§ãBw=¬q€¹²UØñŠ4ît™vUky—l?Œ¥´@§Ãˆ•aPÉ“°N-Û<”ø¨šM*:QW¨Ÿw·kçŸJé'”PöôAá ¾RDçÚÑbÈÙ™£w„Y-$÷:Š–Ð.i§PöT±R½î=Ê7LWía‹s™Â#duÄ%†aýT) R¥•ÈqK­uòò‰Jä‘7fcsNö{µ”£¨°²ök[Áóï”#±fEÚ÷tH ŽùiÖ$NÑM[÷„uLÒ©ü"¹^vá1®Gxo½æ8ÓJbªuÈèlCYÁ' ¹ ¿ý&ßãñe5ÀÀƒSùN¨ú²*/è· °WÜÔ2ŸQcÝ)Àç­ú=sKÝéxÎ(ùMè&”ºWÛa!­˜ÎûyŒçµw"è¯P3ù9°-keíYrì~û~n0.%ÉíÊkvt/îÜ.‘3êŒ#øà©šxÃk1­"‘pžÎ‰ŠÓÚ6¾Ÿ‰[Š›Mnó"¾îÏ—–Æ}Ø=Œ¶ÅZh‡éK†ó¶×Ì—çÜ™nŸWà=¿ƒ-†ØµÓÉ»{ lÛÖ©‘qÝ©Ø+K½ @“‚_R°†ËnžX¢Z«¤(1©±_`à‡ 4j×÷VØ”ÆÜj_Šé_(¥‘¸v%åüöx2ŘXÎïƒpã_Aþ>Tžµ¨ãrD@i‰œXÛ¢ýbŸ'ýÙ£³æ—°òšoþJD n‡Ÿ/»$ÞÏ;GTa?“¯êt@Ùì‹Ê•Ùë]öFS60è‹l,â©£³ …=ÇU˜qüß±›Ž\}8–j%ÒÊΗXX¸°ˆœ™e©Þm)Þt$Öî&é(Ìá§c5è'OãßÌ(G£Pn.“Rs¦JÆ®©m§«úÔ4Þv0ûf†*Klée_Zad_ÞU2¨ø ‘‡Œ:ãp9zQAum )ÆWPÕTÒYYýäh ¬’Þ \ÐÓ\œô´äH&BâÚÚ¯‚ͯZu¨â?=æ5Ñ ÙÊoRd`À.%` ­}}Bµ­TÒ} ͗í§ð9Åg³7eÈ×Ð2¥cËtxñ³Å9ãTJoëZæÁó_s;Ûà±å¤ž‚\EEêù‰¹³{˜ÒL %„2ägŒj_î’œUPw“Õ‘ÉD› ¯ŠéÈYUs€·Ææ!I~´]Ün)ýèoF•÷Tcríªu¤ƒøˆDPœ;ƒŸ)ŒP-*ËTƒwºoôØç‹€÷ f"•ÝÝH}V—¤¶ýÛñÛp¼[²—~˜_¬çø€2q gF’"”ÌüÒbƒÚË“Kö¢{$1U‡†vòϹ¾iÆ×Ä[Ú}íÍdqzŠPý9qLj±V@¸KDÔÀ*Šß5KÓm½‚ä‘'Õ¢c;F(T_ÝÄZÀ˜Gd.agñu—ǯ‚3Õ6õ¯º·ŸbÌÉ\ÃÛ,KY¶ž¤Ù!0ްc‰]˜8bÏà Š·rg² ðW&»³»1ú±Sj×(‡'u8οð-äà³¼ögµ­Šf#E¸ú¡ºÑânGYœ{·Ú=|#pN¡[˜ZÚˆ§bŒ8C«ŸÁ™ 98-²æ˜Šp{ÊW[Þ¡æÂHûÜH03™ÎJ,©Ä¿˜¹\ ¥ÎˆÍ jF+È(Þµ+Xçä/68Œ‡²ØÔ-Ž¢K?þv.­ÕhÚ%$åPÉH Îö“¤"_Æ'™ÖתíTÅÚø1¦Â£T„ۈʵ ¬†rŒu[”¿§055 “èyäÀ¶‚U­i>[˜,lÙÖß°az ©-Fî½Ï„?~Â{Ó\–Þ´g%qŘ€}ŒB@­‹Í¸Ã Ú Åïߌs›µv´0½ ³Jm]s[˜³XO™'P¡ýŒÝAü+¬×vWñGB|âŽ8ê‘«­Ãö((±ŸcVòó¥68ì )b¤²ä«&˘L†˜Cª%z/RÃãüÁCäÊ÷&Å÷·uøÜƒÏÅltÅÁ-i Áê» „!O¢&až˜ ßÅ”÷¢~%ZB 6ðî¾)tEFŒDƸDøËA2iKg´¹ž)VßȘͩ[®F˜ƒÞ"U‡_rN2Ž+7?õovö5Ø ‹Iq`Âýz_p}µ£§i}.à‹m_wRä½|Á“*æ–#HÕaû¨Ö(ŠÚ™Ž ’’H¾ùul’V‘¯lBþ^nœsêãpcq—T²[Š¥ohI5ãû¢ñsCJNšåúEÉž%#ØÁškM‡÷W^X. BÔŒð1wvcÅY4ùSNŸÀ@gý®Þ'ƒêøº6tb&±÷«Þ!È+AÚKÀwŵrŒ-µÈÙ¸Æ8·ì„+&¥Ø÷ÿO£\ý64ë‚hÀ¡õØþðçA%NCôÒ§5ÀøÕ·ƒLع’â䘌 +Kì‘ M ì¸ð ‡ªºÏÐM%6eáWu<V4°°È`ˆùÖ# ©_iÇfî}ñPÚ§„BÒ~É©oER©_<›÷c24ì!‰F€FÃúÎÐ,ž$û$à:KÉ ƒMšñ®SÕu\Óº¤}›ûðµÅ]T°u[gb(ö«›îõ)Oú¼ÔmCêÿ8ê|sÍ,Uuò³÷ˆÀÀ«éÌ`ûLÚí@j‡±®FI ‘`&P¨-¯Òedî:îNßî„[²ÍNþ,n|8&ê¥k>0§Ÿ¡Sa–ÓÆ jîÌŽqN£:zXíE;ºAÂáRsÈ}Ž@NXÅÃicDUÕõÓ¿=‡QM‰ç;\n¬J3]ή«:ö8Ã$Œæñ§N*êÖ6ÞnVo¢Õ] ¤÷æÚÐæ8w« Ïw»s§3îg Ô´síQ/Çrˆ÷ Aws¿7ýPŸ|ùé÷#tEt€ìåï”Uv—)¦²È[Gôð¨ˆ?<Ë9ѳƒÙ936AÝy´°zI2ºò cD·@Ià'O÷{ïf{rA2-Â÷þêòÓΙC!%É™ïÞ:¿Ü ~ zW PÛs³‡c¸úxÛ*×¹°|MžæCæG}F‰‚M­¬|ùî—uçO†‡mªÛÃd«ßɵsÌ!bíàq¨HâWÓÛhC.e+bþÑ>ÎWž«]qóUùMd _CŒæ€6“0&ŸmÚÔî™þ-@†æ´x™2Ok²n:Šb’ÖhæŒ-mDàù7“rÍuä©Ö×=0ŒYôx ¾«t`óàä,Øòð`ú_J™ Äc¥a’鼂|žõëp"bðhˆ² 6— endstream endobj 538 0 obj << /Length1 2795 /Length2 19953 /Length3 0 /Length 21542 /Filter /FlateDecode >> stream xÚŒ÷PXÓ ã î2¸»Kpw‚×ÁÝ=8w×@pwww·àîœÀìî»É~ÿ_uoQót÷é~ÚÎ(H”T„M쌀v¶Î ,ŒÌ¼QyUUf33#33+<…ª…³5ðrx u £“…-@CgLÌÐd(og q±°°X8yY¸x™™¬ÌÌ<ÿ3´s䈺Z˜ä2v¶@'x Q;{G 3sgPœÿ}PÓXxx¸èÿ:¶:ZÚä Í6 ˆÆ†Ö;c  ³Ç\Pó›;;Ûó21¹¹¹1Ú81Ú9š ÐÐÜ,œÍïN@GW  àWÊCà?©1ÂSTÍ-œþV¨Ø™:»: µ…1ÐÖ tÄÅÖèE¨HËí¶Ëým@ø§8F–Ýýsú—# Û¿ÛÙØÚzXØšL-¬E 9Fgwgz€¡­É/CCk';ÐyCWC kC#Á_Ô ÂÊCP†ÿäçdìhaïìÄèdaý+G¦_n@e·5µ³±Ú:;Áÿâ'fá4ÕÝƒéŸæZÙÚ¹Ùzý™ZØš˜þJÃÄÅžIÍÖÂÁ(-ö Hÿ[ftp033s³±€ »±9Ó¯ªöÀ¿”,¿Ä |¼ìí즠4€>¦@Ðx/'CW ÀÙÑèãõ§â¿ž…`baì 0šYØÂÿöMÿÆ þ;Z¸´™AãÇ`þõóï']Є™ØÙZ{ü6ÿ«ÅL’ 2štÿ¤ü¯RDÄÎàÅÀ``ecp°q8y8>ÿõ¢dhñ‹?NJÛšÚxþ& ªÒÿ»þ3Ôÿ¬ ࿾ì@s PÿsffcÐ/–ÿÏÃþבÿ3þËËÿë˜ÿ_F.ÖÖé©ÿ6øÿÑÚXX{ücš[gÐÈÛ6Áöÿšjÿ^\y ‰…‹ÍÿÕJ;‚vAØÖÌúßBZ8IX¸M”,œÍÿš¿Åj¿öÌÚ¨dçdñëf0°03ÿh¹Œ­@·‡h$ÿRA»óßˆâ¶Æv&¿–Œ•ƒ`èèhèÏ š$V€ hM€î 1€‰ÑÖÎtÊÎ`jçÿ«¥œ&á_¢¿'€Iä7â0‰þFÜ&±ßˆÀ$þ/âbMßoÄ`’üXLR¿€Iú7b0ÉüF .²¿ˆ‹Üoâ"ÿ¸(üF .Šÿ"n¥ßýýoŠ®ò¢«þF èj¿(ºúoŠ®ñ¢ø@Ñ5ÿE< èZ¿èœá¿ˆ…äÔÐÉØÔokà¿rvÖ_bÐÈY8Yý.0ˆœ¡óoO ˜F¿è„‘¡±•“µ¡“ùþÙ‰›a䲂ž7Ó?œ±ý+ÿ{?ÿU€r1þq€bÛYƒFó_¦ì¿$66äšY&“!(C;kë?H°€®-¦ßÉ‚¦” øŸ œ¿ô. Ýÿ× ˆhf­ mþðJÙô·…©…ën©í\þ 21û¤7ûõ4ÿ4¥ó»|ì 0÷°7Úþa’YüAý´ú‚ ô›5'¨Ö¿võ·TÎ?R]ÊL¿}s€|Ù‚vüwÖ X¶.6F¿nW³?8€ž &»ß,A>íþ8ÅÂÊÌþ·Ãô¦Ûþ§áì,ÿHÿÛnÐSÀdt½Ý˜rþ%³°ûÝTvP%í­]þH ô½‡Éá·P\ìœ&F¿«zbþþ‡Ï?Òÿaa¹ø£1, RüÇ:ä´±øï,rü²ºþÑ-'Ыù/oPzÿgCX@¬~‡½GLÎæŽÀ?ÆT>g7»?€|¸üN ó¯/HNÆvŽö4®@a·?ÖäÔýŠêñõÏó7g'O ãß þsÓ»8‚èü×c zþ‡ÿúnºáWíŒù‚,kƒÚï«…ñÝö'ßÍQìk¤Ò0x­8v¸<"Ã&ÑTel:Þ 'ô¢¬íŠSß­ÿô:m©‡ mMPn{ò~Ö{?³ß¿<58Up*\7@GÀ *tàýÓÁ[Ýß ²¼K†"×Á…Yé3ú½[¿¤{Ý@é×ñÅ}åƒ*NY„çÒY†(µHÿ¢yŠ<£¬RgÂ7´hßÜßÎßÜΡåL½ËÄÑÁûœE±}ñÒÚb~Xð\/WeuêÆ%ÇÕÂ!„¼AŸ¡ô9J–Á^ò*.ŒÜ|·”ÍLö9>@ì=ÖErΫ-'†Ílí¸Â#9NîÓVÇäÿ¡.s_ÅÀž¶Öþy ‡ÎÔÍMBò³bsa¿ÞÁp(Ü]˜#‰¼k ¬‚‡×Áö Ôæéìéy픶稶éüæZ“ȺØÏP y‚ÜÝÞ–%ä5^}–Sgösîî*ƒeâ.Èð°IioQÐ Ò¹(FânjÐÙuàªxÚŒÀàtzh´GpW%Ô¾2:\¼°Ÿçk¥rË>yº¹4xX'NJs¡5[Çka–C §…Ó'på,Ž”ÊÖðÞ“ É|5©ši“8Ÿ=¼ëÑ/Í{2A%3£«}<}×t$p5¯•jø±¹)Eƒ \á#\ŠC“iu—_«v°à¨ /t  _|â‹öØ$en”4B/ûÑÂÝ-RäLò[s{+Ó¦0íŠL ,‘ç‘Ñë*‰^A³÷i²%uºŸ&bùU攚»_߯”ywSº£=NЗ°¢[Mæ›:®5×£µì1ê>\YZ3ä¯A)¦7w –A‰Ö°ßºÀGÊCЬäóàÓ·ÙÕ7cx³hɨÿs2*wuLЏaÝö Jïä~Ð-fdN¾iŽÖݦyë@³2c\àl ‰Ñq½<ÖÞÔ‹Y¬Û›S¨ì0ç8‹O÷„©ªÓÜ{jšñ¾è½0ÔÆHµì<¤M¦õ­Þ¥ÆšvÄúQÓço?m$úñÖ/˳êSºðWÒFØb%d}¥±B¾p a©r ¯É?)*!‡3òE¯ÇFJÒY„|¨Éæó©¿ÏÆ8°Ðüp#¾äRFÜžÏ1Ôfÿ5VDº½p;/\€õ\’Ëe¯ÜÅÎl .•6¿ÀþÍEû ÉM³£/9={?‹µ]Ûyzvd4y5?²>SÐüGZx³Qæö í !¹¼Éàƒpr€R0bpÆ'^Ҁܫšèoµ™ËÁ’ÓHSl˜‡2t±†ç{”y“”Þ¢Üwå™ßÛ?Òá7\XrõPœZ½¦`í £Òà‚Ï„©2M;„á©­MK×ÜŶ°$:‹OÌ6­Bšùì‡Í‚Û—_+¡÷^0™!+)뺷Ð+V/“ä)‚–ÅÌíîµ;©07§™­K¨lG§šËó«¡çÉ Á1ͧ&Æ­´oßý#ÄÝ4©Z‡KïN8Â$Œ?¾³µìdÝéX€Y4Æ8ŠucAŒz¾?bó3Ê‘Ö Í ïñh®åßC2]Ì+Y;‰HØ?¹*|*65;£è²Ï{â·¸"V$¢¦ò*‰Y¨Cv+{Q9PfPq‹½^ÍàïÔ±NMvøÝITø‰,ÛÍEµÆ£ëAö¤\hæÀ œ®¼R%ÅV„ ƒ+zÍH¤~ê3ÜÎÐöºŸâãXÏ,P²ž¦ËU_õ\ÍÏ0Æ"Å1`ÓSE†ÏQr…§Ä«®Þí9)Ó½{ÿ>£Tô‹(”^ÇO²ÂçÛt‚C"§ä‡kC4'Bñµ¼EÔTô¡`/"’¥ˆ¸ Žñãªy!I Xš~PoƒDè­² ‹)Q>N–‰“f¸\µ­hn=–\  ÎèÕS'UÌQÁؤ="ÈR½•Ý™C¢ÈAÍßRR ç•?ò Wa“d},Ä©“³%ÈðmAëC•ß×£›XŒæ©}Ðwšø9×OÖ†¥Ånã+ •jöE?vÒåyj`öô1dÌfÜHvRÇÛúýGUgÁ*ĺ!Fx5Ht?Z æ¹µ%¼”@ÁFRí÷l™ëÁô"ªªÆH—ÙJ}Zï5~F혈¿Ž¾ëË5@[¿]ÜõOõ»]ZPÙ‡m"S¿ƒ*Ódi9¸-û”«Ö5S^Ìt¦ø­ Oa@yFàD#;ÀË(zf1!Ëó¹Ë]j€ÝuGüyžÝ]Ÿƒ(l?&w¥õ9<½ŸþGv‘ÉŽ5•јѺ}²Ô-#@1¡úˆ{`NAÁöN«_òÖÁe‚¨i¨fQ>¢óGÙÓñ¼ $#¬Ý¹/mG2ÚvkçÛÑ. †ýýX<ËE­Ý[?Y°3êäK/a¼i'ù]BA*bvØ.Š7Úu&Z±ÞìjõÓ*K—kŽ<ø‡çeaËXu¨ïVïN)34óÎ,ˆVܾ‡Œycãd…¸ŠVE(=w% j6¢Ž $wd`IºË^<ó†úòÅi¸ó…3 èR&íNVNßTV ùzbx¿|¬0¤­œ09TCˆ…‚¥at–&0wˆ[z #¢e†Ìu¸ðk­ñ«8 RÀRƒ`$ŽÙâzÛïÇ£èÜ¨ÍæõÑò{‹ýàòËÓ27ìf’F*ƒ˜Ü@G{´×Ú¹A-F°‰["¾÷R’¤Ì«'SSæ‘U§yЧ°´eùÉ­è˜A-”ñ°hð‚7ü\›^Urö¨}wê4èhÛGV£klAgiªvÏ¢¶>ìMZ¯ŽÃÕ^mŽØ=jZ¯<â¥9‹ó’•Û.qì<«[v¸LÛ¾ÇÈî;É1*ÁÞ™¦<ÄKå‚Ý®]†EÜM%ÄŸÝ4øž‚Óìè»á°¿ˆÈYYÉ6xÁò˜¾13{¦·>ö.£lÇ÷›ÅA–6¤ÍŸ'¿ýDØåJ¶Ö(pÆ¥vf|üq¢¯¶ Œª #Ô¶YáítÚ$Kdúa¡ÆÆ`Ù lñÊ«úbIª‚ Ïëê[v.ÔÉ·Ô3½/››HÅþH½Ýᤞ£;Èvнú‰ÞåÆZ/ž"BMZ~ÂÄë[B†ù@÷ä}|#ÁØCÒIÌ$ð×XÍîàË‹ÌEìOǪ…f"õÖPè+QOþü›,–û;\œ‡?É;Ùk€àÕõu€Ã¹}z×É„ âõcÅÔ»*£cÌŒ ]UÑ,4&OXdßG¥a&øÚü”t±Ñ:F®Z°Þƒw½$=%µJCÒ'’ fd%øßî‰äLM?/q{¯}•œÊÞX¿Ôák•B„·܆1f Û¬r'þ0 ƒ‘ËB"È»…¹Ú’¼‚åLFÔ·…%HÑ2s—d®ÒÔöLÏN€ûF7ÍiRÅÎ!-ƒßõŸ)qºÞxºÄ ÂE ÀY¸×®8~E£tì>$@B–>;A‹ÁYmÑ@}ãÄ¢r¢bý g_“ü"Ø€¦ ·âf¦g‰:ë¢+ Uáþ=šî´„t¥ª•û· K3£l©“7ŒÔ¼ð=;—e™Œ‘Ó)ö]¥?°>– è{ºÓ¯zéÅOë:fìpÚU6…4´Üä o”;K%¨®‰þœZ$)òM;ìøër?cx47‰„ÙÉ9"ùy½3ín,'§HÜøÐÞR<ÐF £=–>:›8}ÆÊWð4nlK/z àôø¸ÜÛœ œ°FΛ” ‡ïê9yRu óîOj×—¦ °ãÐÁÿ„(äpÙ|'C¤zýX‘ † Î]¬¹Ý„eÛŒ>=åõ\Ãàÿ¶ýþñM¶óë¬ÒóY¢s?æç"÷º$î¥á¹÷_·±u¼F \Ö_µ1Ãð‰Š~P·°õ„Å<sõê,8Ú„(È7œ¼DL]§ýÌ•¨°*¯E¨ƒ¾îT´ìJéÀ«Ü\= «‡Õâ-L;•È/¨§DДާ&ïÙ‚-•¹ÒT¿Ëà®?ëféù cB&#Ç‚%ˆ._?,ˆN:aT4®ÜƒLpÙÙbjÜ4=—ãXßQ…Àofíu™Ç¡Y%;õÎ_eÿJ÷Ô^(¬ÀO–cAÊi+àéf sð„éz§5bÜJ`ÝåÀlïcâϼˆÅ *vë¤éÄ}¡‡ª.}EéÍ.ÜŒ)&¯X=(OÇ w$Sü¼ŽqâG4.™Í™Å«û ¥¹î»z•¬’]ª<|O/Ü–S£†/sÆVJFo|ýÁ–á™ójzûî '<ñw¥ç*H‚T›#Þ—’ÏÑ! (>cÊ=+8Ûñ§O…áî©Kz–‡sS»Ë—`,@ènHæèG*Üï†ZƒëC‚â¹ò[®Ò¼I#?ÕY¡dReüD7ûIË Ì„ó,wu|T7ÅÓÐõz…où§¨/¿|ìáìFr£èÇNê!àëÙ¤ÐY—©’zYpVë»:ª+~Åúò<Ö&ù0' Ô’'…™Ø£‚4ÆñkÐß“Ó_¹¶eH¸EF;¢­ÁG×!ìnˆ¦°\Â\áe›‚T'˜µøK Û¯åõ²íÄ!¶/‘ø?„™e‘ô|‡¶šüèàH;·øm$[\£<̘yŠêI‰XŽ Ïu*€“åÒˆ*N¨#"ÒªM‘ ó®×h+À£†%·E”QWRþXÃu‚<ïºæC ãçp†½0åÇÚÂo)}äl]² ?â|aÿš£®=¾EÇøY?Øè¤˜Üù¶,–儱Ñgdqh®Çxæ¹Êk¯ŒŸ?Ãõìn­ykÜsñG(ÿ#ÂØUòðtþ:ϸ#ÌNƒ?i¦Q€scÚh*¹Çñtébžú@W#§wqv^ }—2õæ#±RH|“-¡–èÈ`F¸bö‰Š¿Ü)sݱ߂a vkÀäbw+̾JP Çd҃ק€7óƒX+ =´ØÍÒ¢•1^,Ã-!Âá©›Zu{°•¸ŽŠqÔ’oðlSÑ8w‰1Úc>óXìrl¡ŠýT¸«%&¢r“ëEBß§G«µ$M:Óp­óŸ42uÍh)x  ¤_‘‚­ D™il—Ô0 >ïǤL(Qêvo®§”FÃIO{=-ˆ±xGýv,%÷È“7@ÛN~ò(°5£[Ÿw(míZé¡ôcåÙ$rN›2ÀµÕsÆmoÆÌø OrÕñDî34¯¬8ä…,Írv+L§–oTäŽtÎé?C¸h‚h6m(#ä4Æ•ç‘vå¸h*êÌnýšüC–¾ÇMÄ5’2†u·¿šÂPÄ3~ÒîÀ¿­Æ–½ àå"¨º±Ä³ÉH…D,%i *„êÂ`kqÇèÇç×v\ì•A]|ÊÅ=µ]×KsjáÍÑK‘÷êãOh˜!€çžYÙuæ_Õ ;­Ópú ÇïÓ‹âà«;¥ üsÆ÷2zøI¢­ÛêuffœÍa ŒbŽÙ ¸á$øxÚ°ï+¦,Û”Û’m’ Þ^­HúGIwbÔí>%‰ö 1C¢íd÷Ïz™Æ%mè0hÏ‚U’ r ´ÚþÔ¦ˆß)$ñdà¿ L÷Щ‘´¬P‰§ðå‰iˆv‡É¾Eš¸Kc^Ìè4¿«T9m‚pìå6;ÅšáËuPùV•¡0w¢.í/ƒ­ræWvìh uùRj¼ÎŠaú£Ãò¤¼Bv¶"\µ†™k˜0A˜Ï¹×¦ŒCq± ˨¾´YÅb8îʧJåýÐØÕñÍ•Ÿ#D E‰;7ìøgeÊêGØÄ–ª„²<Ö„‹'j~pþ'2<°ôLúAÑüþ5yï…ÖÇÅõŠáakÐYþc³$–a×Ö¼£ØtWŽ*wCÕо@Ңﭸþx°H·ZO\È>ò\ >WÝL\ÙÝÝáxmò‹EOx -'ËQç Å/r62W˜C,m*S¦’>2¤5–=±@ª$ó>Fž7½m:úPÕ¶ü¾Æ—^Óœ¤%¨ô«R ib¡-›úËfj2Ö\T DÉŠQ/%¢ƒ”‰$ -¹“t\óµ{¶È–‰±0ë§úR% *¤½‡Ýå,[¤kiœ4Uæëˆ·Q¾Û=,WNÂA'`H®?¨hÜ×”p^¡Ç›Ç¢c\8¦¼ßQå ? ”—P¥½mÆxQn- vØ•ß(ç®+.1×hÜÓeâRMsªé8·1.½w h3÷›ös PYw¢§;0-ŠÅfÃLŠ-1åß¹ñ2™ÈI õšÉäu7¡Ißr©ÐÁ»KñÎ.ÛZZã;]\Yqrfq¬SÀ˜q4=ç͈Íð…ÿðuÇét~Â~zWŽëEM+Å?¬3oí-±éžð^¯;3uFvQøE‹ecu;ÇØÈì`—˜â±Z:Á¼¥Ãvîó’~kªÒlÜÈ } ¥Lùqí”tðÖ TRœ`8.ë5Õbœñö0ä(BÛ«òFr€tEO:¦à‡ 2qIþNë»Væ<}6vEpÑÇ„v´½9— ¿=ݱãðM4Œoï÷©úÓiy¢É  Ù‡]&´Ý`Ö]ªk­"qïŠ:%B•«×66žàépÕxë͹éŠ=÷‰æ1‰g_7Û±†kHÆpšº8ϲIý°­WGùú3+¶ÂϨfÁ ¥ÍÁgî\¸­Î‡ ”•¦„+«è´ñ ©î8ç¦Ëäæƒ9ý-” Ëwµâõµ‡8ˆMWêµÍòÃG"•±¢¼ÞµuX>Y¤§à¦îô}°? Í¹¤°xšò¬8ÈI¸N:>¿ p8¯ö¼ÏÓì29ËRq(A šú¡êç?3ìiñ ïJPzž\µº¢]x¼Ó‹z£¥KLБÏßIågojÎiÃ;6:Ó¡æ>mD_±2Ö–²÷U^Ó IæÉp*x Gc½·¸7æsZX!Ê·L_×¥ö!G{ôÆ*(þ™–:õHtGøIÖPÔ±e;ÓÏG>Ÿ¦}'N[¦‡Ii!_³g[C—Ú$Ví$8ŠëÈ©µJYK©2ë“HiW‹Q©°c·ð”`s;¢@¬éÛwE4e ±lܰ*¢í.Û^Þ®‘‰ù55í€Ñ@Ê…Y˜9¾5I#ɸñ‘`°¥ÖšhÃ;Ñ%DT¬ÇT$U‚'Kf&’9‡Q ¬›¸x‡ãïÅ_!arξ©Åþ–+pg*RU,jg)c”â ‡ŽRtVŠ@€ø5™“Ј°šµ²€LCå5jh6™+µ²Ë›'·«ÙdÒæ%ÊÓ5X÷k£1‹o®pÕ’âo¹‹°#p{¦Èðî[®Bš*b§´š[•‡´¯ ¦œ?µŽõ@òÄÇ’VÊ™¬Ë&¼IÊê('»Ôâ Ûá J‹jC²§áª!.’cÍÚ}¯w}V:d—EœÚûž˜à}ÿN¢‹7‚³¸ ßZ¥OÄ8‘j1ò g™nˆŸ6#6ý{1Ò8c~`ø/6o„òWª…÷=™Ú4§«ßz©´…z’õ²P­W¶Äõ3îá쬯¶|RУ}Í&\ß6i :hˆöXs’·9¨>·é‹$…/i{4`‰±RaW_˜â \Ñ øW\•’@(•iK,? "©ž²ÕR¯>ø‰€³ÜLø¡”-½zÊÒì§D 9yn•ËÅ:0¦õ´ë ”»I,òJuédyÞñ¼‘4úÁÍ?`öùœžK«tÙò1ºÊ«¥êt×{ Ÿ!ÂÅI€.g`•Ÿ[SPµ2¢»PoŸæç·›¯Ãqo÷E¢{E»Éó¡à„ç4D Þ<Þ%$nÍâêdNYzóüT´0—à7Aƒ¦Šøñ”hF8tÀ0Õ׆Fî®zùy~åTDJˆ° »_–;¼0ÑX"ìÞÛJQº‡¿@í–ð›v@@u&j |éÏA‡žO~›­ Rqë#©ZzÄ—ömm—wç@ïØÂu‹xg}ñ‹é€T­Ð÷'šõÉöD?ßæWȃCÓ„ï#w3±cgË%Óoý¤!î s Zm³Yâå۰¾„‹eÆP!ÅÊÞ¥Ÿ—·´xÃ㈼~o—ÆIïšP}ž˜°íéÓöNi\öÚ× [<¦¬!4t°õt豌ζ2zÕ7W IÁþ2Á1ÄÉÈmt3ìØHlZZT]ا ªÇ3:q»D…lÎ^Þø„(ôDQ î‹£ÌYˆ¨l1*1Ø´Î4|„:¬±ÔŽ>EdÒ‡U¶Å‡Z"dá.0SŠçâCâŒþÞGͳ#’3ÆåFê…³Ó×Éloøë§;K^xá0zÉ”¶°‹€úš°$M[¢z<ïÜ®}W\ E˜È#í­¿fMcç¶nkyC"Æ[Œc€Ö×Y-9RŽc±zÍ2o`èÑ .¶‚—V)—ãÑöyÕä0ÉŸ6¯¯&ÑЄEöñN|é ™èîWÇ,Œ|¿³)&L]aymoÌ´ìgßÏžš4ØÇ7ó·¨?§ªÚOí=¥0HRÖÀËx¢?ªµö]Œ9q¥3Kªþ‰¥Ø9YQ5`w,‡Ÿ¿ôHÇ)u‰RoÿŠb4¢mÕ+´6ݼÜ&¡¶ÏÓ3±î…3ƒ¬‚ñK/.ú±‚í±8RÇÖ;ÑâMK×Þ§¡/¡>-÷Hø²«€¹Æƒ@–!þe¹P×òÕhöÙúÏ·U¾Î|×rsúVp§Ü7Ybj‘žhí*øîOjU OÌ,å¢âòbüíKO[PcIè9 ½´_§{ “j+ÓÄÍ¢”“’7ﶦpÙ¬^YnìàMG¼Ð­j1$w‰ûDÖ#y#–bŠ=®CæhpªØû9 K<5l¬c_ñ'˜ËMuv!nüqÞ#êù@£0ÓYdʾ~–]Ï«!A%mÛsZ¼Ùÿ:Ó3< ¯Äü¡D èäuݡƺç¸)˜#)7‹ê×kå|}Ørö$Õ¹H{ŒEy v Ç”¤ ?dayú³L[€F7ð'è¡3‹z tcRÍž9ßi[=p·ËÌçLxÃa°ó[Èu¡i9M?¶)Âx+òr¥oŠ|¡ií\'W(%‡´JÚR6@á 0kÁ㱌Mz¾i‹1›ãqZÛê*ºK— /ß뮥Ðü´ÑW“`|ø¼2aUŽoûiü^é¼M ÌÕÔÎÿ èâìútI¶ŒÐ6ðâ˜? Ž1+M@Ôp|;¾}¶Nê,7]´bt[ø&W¶‹’£tHº@øFw£LÃgªÓÿ Få,{(U iGØÝ°ªõÖ©™÷Ó0þI“rõ0›`³ò‡Ìžû-Òù=Ä&啽ë3âfßbc&د.][ý05¶ö}þº3?Äs_}ñ`çm[ÅGKãbUhCÞUÇÉÔaB…jpËS)S—´pFRŨᢥVHjá Ž+nÊþ›þ¼Àj‹ƒŠ'f€%¯C˜  Yåj¹¡˜”ü2+_,¸ºYòcÕçMt‚ÍÔøÇsÛN$»ø¥Ù¤&-¬M¤è%Lg·è!>D+ÁdÏÁçåJ“HÞ¯H$¾-×c$ˆÇ,Ã"è&šŸBÙÖÛwÚYùšhmÝqåVW3,K´Ý“% åîè°”±´R#ép4³®$S¦Û-—ÀŸµ}ìÐI™—d˜8ºBNL¯ôžNI?D®«HC:{Ú­¼uͤ:+cËbá¢ðEPçw¨0ŸÖqö½ÚÞ„± yu¯aîc»¿@Ö}G…sLÚ'VÛê07”®Á/UÙa}!#ˆ0:¾ R62 P±^@Ý‹{RùÐ õÓiãhçªÉw!Ò’`(á©,<–iãç2?²â°ÕZÀœŠ|Ö:Ú¸>Ó: €©.‘ÔSR_ë8Ÿ|ú^m©‚hT "w_u¼ZrÍdoÓœ…tÔJfbývƒE‡àË2S™qôstͺÈ\qç–`¦JŒ¥ÍByƒÏˆ{Ò` ®l—Zn:GöGDd~'#ƒ¡7xW¦cF˜ sˆ÷ƒÙé•·b.úl<[ìdü †zÝ;3‘ÑÄí[?­xâ¾c6a/ó4¥1ã·[Ç\®P U;ÏXFˆó¦o!…ä|·Ò„ÅÑÄŒ²œ}ò:U é"ÞiÐå¿äýXÿì÷Üåíå–>ÔÛäôÍ:U=AŒ9쨷wbÛsÛ'tÿ,ýäM§–Îg}0z¡×d«Ñ³U#1ëÌZDÈh©íWYAHôÀ²QœIšeÈË:sv÷pjíOú®u 7ày4÷YÛß0Uá%s9ª½%ŠgÄ“²{Jy¾Èq’µýã9åú¨*ê“KÀ;ÁÑ ]@QpéƒYð4¼Ô öÞYÎå=ê¢{)|ïÊ?’ÌIÒ@a= ‘Âñ ÷ž —ë%r¤`Z†¡]V¿h>`i_}9âgó±ÜXe#EöSO+¨gçMÙY¶+,™û(<ÂFº †ÙBPÑŒ÷u<+J Ÿ1\Úcú Ú@j‡¥¢`møw†ç%%žYÛ›°Zv’­²¥KµÔ€isÖŠdF‹ÖRA·Þ\V'Í¢IÁ)í=E4w'Aç¹j ±Ë_ék¥2Kö>ɽO3¤ô€[¾uûö˜{BÞ&”-±dÉ~¸c“ÔpT8| WÀ&iž Ük ˜ý¬"¨‡z+H‚¤ZªŠMæÚiŸ0ó'ì…&Þ>¯Ý(˜Iß¹;Æ€¯¼$ÁBõ“Ê2£ÉˆˆLˆ¾øæÈ,í’E Ø9-f–U)ãî‘íwÃ'Ÿ÷Œ$å$I‚å®#òsîñWŽËѧ¬2½øU¶ôcððýnßa~i_]ꌌ_¾+>ÅR2æz2ªaEüjpH³v#Ôm "uqZŠ·I.0ª„»ÃÏ„§àŠ„÷¹}Ô®%sk»7»‹³Ù¿„ƒí¼½ÓêÒ wÒ¶ëÄ\ÀJ=Yˆ=`½ðv«°IÁÔa}©Kc’ÚÊ6)v#øÉzÜ[ºVXe€j# VQôâ÷Å´4|HÑò´dÃ>„*Uü$Òã}Ëú>ªO¿Š’‹ƒšÉšôº9Ç™)øHxÏÝEû ½èÇÃ5RñËì-\Ñ"ÛdŸÌÅ1îV³Ü]gÛ ¢èI5Ô‡<™ú”LDÚ÷ä ÇBÛÚ„:\‹81‚èPx:FØân•^ôãýs.{X … :J}_v!1rcrXã²—MÁ{^šh†§‡*>Ê=vt2«ïsÉ5(Æ\Á[ѦC]@kêÞ¬`;øGm‰9@–=DdûKø™µ"Ò¨v–X+ éµA6˜©óYšðo¼ˆq]Á§¬2´±|§gQëFÙׯ_K_ÙØi.0kþžì1œj‘Jj±'éHqóͬ4Œ~ã,©»Ò}Bs&‘ïZèx“úÎÕ"Ûöê›dó¯´#0¾Y4ý©sh¸;lr\p·õ•Ì a k>îp6Îx]Á¢I™MêŸP Þâá‚ÕMHq2DÍh°$ùl¦kQBF±rÑ£;—·öûÊÔá‘jbG;Y…zÔH€½ç”4!èÅezÛ´†áŸirú`¡!˜…ÜÌXxnjÅ £+‡ýuúçˆ5Œ`¾«/¼D`¡Ûº_롱 ÀòÅ\]¨&ÏùçJŸw^Lù\’a«‡|C3ÂöÔ|)@"³#);Q޼ʭñ s1b0×"—x{ ÉÊ~Û #䢬ѻ@ûµE+Ѫñ1¨ABÉÜú ºC*”0r{hÓ!üÌbŸySWÙݧchµ^NÞ[ÛŽú/ Pw™â¦Û&µj/=°ÿ¾b¯/ò”錈LÕ×LÕŸÏŠö­Ã5…õŽõ'L\m´Ö.úÎW_÷ø|—å7L%¼îŠDÌKÉYRo€yn#óp±®#«pw{[ÙñÞèÏÚªÁÃ?52{Þl;ðwVŒnEC‹M¾ õ]–¥¸Õu8°«šéHÂDÅjƒÍþØâE-ßêµÑ,j'ð1YTCÛ÷Àæ1ø•;ÐvU-U{¤‚€z½ðq?n˜ÅSqÞ&WÌ:×\RòÉ•Æe[Îîým‚þf“[Ýô§XWK)}«è*ïÑŒ:¶×CU>ÞÊv².=Î&sù¹žKÏwšEè¾È§!T‰;÷vV~è_©jÄíJ˜¤ØT=Y+èö³])…¦‚Ÿ3®7×ng‹D©pjðᦼÙ(«LêÔ}ÅÀÆ›…÷s'¨c–Ûö "œ”7${ì,ŽLÕ®Ð_ùen1³‡oÇñS†Ž`8tÛ~bÓZ½¤HОĕ|¬©®‘b’a(·¥˜ÌøsöZjCðè ´}7•#Üè,óh®Ïå ßì–G×dzÁç2œ(˨ھã*A¿%‚iëyEá§Ñß È…±“ކ&õt®‘‚Î~µtÍFþ¥ÊsÚdM «õn{üQ ¼¶­›P9œ€2@¤¶váîŽ iDmÛ@]é†Vö4þ]–इþlé— ˆPN7Òâw¥ŸëÕù¯‹öÛzÑÐPÎ*‹ÇF/w—Û»e3 ÷Ûæ·E§”$¬¡ìk9Q¸áÔžeÙëÑDD»ðl‡¶ûDºÈ˜Ò¯â7®x`;Fó2(–¦ô{Ô´Üe7[1„áÍŽ«,f:‡˜žó§ÏÖBñ=À›¿9äèík·yNo™d%””¥6±PAð:¾Ñ’‹¶ð§ð¾šAvU¬œêܹ›W¦5àðü¨#¦,„JuüµŸlðû­uø.mäæÜµªá„ÀÏ tòp\Ë@ë|h*Ë×™)Äš$/å,ƒ±žoô%7 ¢ÝøfG²HIY82?FÇÂtv‹Ü§Ý¿¿+Úó¾õy÷¦ûÐ`?ƒ›ëóÞ‘ëkŽ(­n»VÀÐD=9–qyÆÈ8 °Ü]mh3Ü+¼ö¨Z2Kç¡èŸdƒ”_.ôìþ i¯YO//5——^³j a7RÝþ°x_|ŒÍRJLϤ“£¹¬Ð&m=_¬úçWvÍ‹±Çìnl?r¿OaÕÜ®ZScÎ4¢WeÆ-(Ç)â…VLú‡® 鉌ô :ˆS¿‡ Ð¥âëÀžÌpP½›4 E0€dbP• æsrÜäZj#Hi²M’i°Še—j£, ~e‡Î!nïLp·OׄIò\½Ïþy÷KÊÏ )áP:’À›ƒôËIîðANæa.†#µÐtahMøªlÈy}fE’Yë^²Èá«Þo3¬†,fHÖüŽšö&kೞ3ñ‰ËYÄÖK7Äø„ʶš.RP‰)[Yøæ'úÐ6÷Þå8¨º—2; ã"¶Ü@Þ)¯U˜§z b½é{ä„{†šÅ³ÅĹ•ú9¡þy”DN ­8wòx‹ŽÎ5û Þ)Ò²š™¿|¨“T3]›nwVúðnòVGCÃÜŒ´g@óÙzû—w‰:T64dñ„¹¨!Ë€‡±Fõ6Ö1¯§Ôóª´Ž! #ÆŠWÞª½‡1Ûë”Öo«£ÜóÚ&ø¾&µ³Ég¬¾óA“S\>ìõq<–+I|«˜F¹Šû°I²«h¢ƒ©’ÔüX~í/ØÁŽífîl³qŒßÿÈù¡-MVg¶Êžh{¦ÌúaÈ=$­×þdþÃÄÏL7,ÊæI· Wb‚§…:ž/Ó—kB$pª„¹\­SbeyJEázÕˆI ÄÖ`cŸ‰Qü“o7§ŽÂ)樔;ç}ã Iä×8ðF–aîý^|;ºÈ§êŠ2á?!S&™KúVßÝþ 1ä^‚dÆe;ejEÌ^µd&å’[ØktœÞåƒu þÊö•Õ̰I7 ²›V´Í×H°$}¥0+6G“òCeKÓÜ2Jò³>_ÍØ´¾“ŠI¹gŒþb¿ùv§c’Åñ’ód(Š}³ír  ÌïF³Ö òM{–%¾Û>qî@›˜Y  ÖŒ~Æ„Á6œÍ«áû 8¶*ŽíwLÅ.¸uÞÂdUE¢oY“uÏÅÛ kÒ$õ=·z8ʺ7%ŸµMÇx÷¡8½u a¹ÿêœ<Óçí@ÔK¶e׬۫òW ‡øRx4àª4Ñp‰œ|ÄŒØí»Ì7îÐJQ“h·ŸscÓiüÊàEBèdU/Á–’ŸoÄÇ(h"ÿ"+,r©j|Ô8hˆ®S)æ”! ¸e[i>§†>ÔüýÀố¼Q œ^ý‹ˆÁ=Læ^ä e>¿Ÿ]”C~ƒ-ü¤s‚k¥Â‰K"®q+òàÍN2þábVb¼¦ÑO×OI(šÞ¼û´é¾wL¤Eø…Y¼ÈCü- ­Æ…§Ð]ùu²£^mb9ƒl¬ž>éЖ{»}ÖÑT8„8ˆCmÚXÖ ¦=ûÂ1²‹,ü½øI¾Ëf£x¶ œ§ó`µ¾Èïgã/B“§„½HB?\Bù=Ã’¿iÊ?úŽHù¸ˆÿ,0_eû±}—x¢&ÆGúÍAXÀMrD÷4sN}´d2Ê“«ÉQ$ÓiZhQV©!yjñ¬‰:øïv>é“|yÏHlЬˆ}QV¹)×Úѫ˂%G¢CŽ ŠL™_Ài1GÝt¶Š/M[ˆ`v¼pT¯[õ]_•®_Ž#Nÿ„ÿÍ;J8åæõ*bâM­DÀ;„wòe.DdzÃ1Xª°Dçt>*fá=–EQ ïX­,™ÎGÜW$ÙÅ–W5…ßæ Lß!ïÉG¹‹<R‰È%„n)ÞçiÜd4ãäcÝl‘š^©úÕ§7{”ÊIHªåj:^øÑÿÙÍ/‘+’Ñ:ݰ!6d ÚÏv?W3`œªü2Ï0ñFZ¿ mïÚjfêM²á¸)•RÖÀXˇaËjÕÐLÌxêÑ;}SU«)—+m´n•Ôªo `›lɦF ˜)ýùýÉ\Ïú‹×ÁAÀ‡½W=}B¢ö“k–…ØâýÊ]…â%ަfÈé”u¹9Hãáñ]~åÉŸ¡6 ›¡³óÛë‚(!ÖöLõðés»Þ/,—¯'(°£Ñ­¥áb‹G7‰ÈFÅWãÃHrÉlö¿³+‚»~ñ7¦8?5 °}y ‹I*"Jyº§ö7Ù=Ûœ{ñdŃòhl!¨ãu[k©äA¾œ:]«4ÌîçÔv]­¯±6D^âvij²è<–c~CjIšÀïqÛ"÷ì %`ý‘]'[Œž™ä%W!š‰Ù6Ú‹§8’µŒ¡G ‰|¦é5ñl@|"Ø 1¼Õ«0ÉvFæ!á÷†ObÃ`ÍúhvÚ‡…è+¢‡,ýÆ ê–—• õKÓO­˜¢w”ÖPºÐ¯ŽÅ ´Vf§!0ÒZY^1óˆ~‚­ÅDËÅPgo—§g/Ê Ôº“¿.G!»G.ò“6‰¬Ò^ê*ôÂy~ÀÅ33Ô?ïÎf·íÊAÇR÷Á‚‹½B…ÌÔõéŠÃ×…iG8‹Å~]q@ŠÇîíÚ>Ûp*˜\¤ª`‚”MésQ— ‰ !M#í^ÎP‡9àõ—­)0òÙ^‡Hd‰|1PGݱᶿEÒE@ðsâr´½’i’Æ|ÿè’½YL(É‹?ÆÚ-ÚA¦²‰Sç“p\$Z!(ó6˳oH+Dq2$ Â/€•Ù~|`¬,ž§Qo k+÷´Pê+þÉemøñ¬T±Ñ²Šg»$‡×ßÅ p^ ¬ z«ÒÆâÜíDÞ!÷©ãgS<5§+]&>[a”N3i¯¢ìó¨îv‹ [€‘sÕf÷¹Çx$w3äxü ÑHýàMDº/Ü®4{ôíó”kÉ_ ðt\daN°×ô1¦OÜ ýòøM•…ø{ÜÿZJ–×½½³’·ÿ5Àu¬Ò¼·?ߘ¥D?ÿÂj¥/yìZ«i–´S_IžUÝVå—ZSÅ~l E^ fu»@Fʪ:C¢W8‹›2Dû·I6PBÙÊöÌäÇ—`’tY[ø‰«\ðç-3Ÿ{Æ!$…*DbwËg‚$-Æ‚o€wŒ®;AA•eInn˜á·g5ì¬åFÛºyÌ–°œDգǨ’ ¡Ë`þƒÛñ×þßfíkÆ1F[)<2µšÒÀ˜„®—ÁóÇãSû…Ïœ¶´ 4Ç5Þjþv¥þ؆WÁ.²W°§T±%WÆx:<‡P€àÛû'›~—{ˆ¶ðf^æLŒíiü›úȾoµƒÑ_ÔöÐá@"­Ãq|ËI«KwJo»`ÃÔ‘X®6"Ûên«îvíÏ©ùº·† .Ó²±„ýE¶m ul¢—!Öxƒ7÷â½6 X’|Z ôdÚü¦ÒYEúYVN¨ ¼†4â—º|®§{0û¾9¯©eΓ¡Ë7‚Ù^âÍU¾àc?iH6da–W©žH1° SÈö°*‚Cp©ÈóádqœdÝÈɯºÍŸp ÖÆ&.È ñ”ÆNörDO[áY+òz‚o`¨ Ç>â§ èìJJz6¤â{>'Ôê*NM†¡–¦ßÁøB€÷¨V±î²è&hXø×OO„aÆ98D+ší™?xnÃÍk€CbÊJÇ®'Éîí52Œè'u:nƒ—ÃÞÈ©ÿ¶.M*½9רÑùMgÛ ÷iÇÙîFØö¸Ã©²'<³c%Æ;¨£=3ÛàUã€Ó¬žô¸3ÙŽ¥ v® Ç½¬ü[LRÈÑtýè{³õ꺲硾ß)1›™­ˆøRø€:×ÍÛ\ ýz¥G– «ÞCrÅý\´}"/‰;1«Ïs›Çãx¨pu±«S‘Îâkgi/šK&EayWo¸¦º‰eã¼Ð6ø<ø‰m¯ÛÒ8uO3|çö Ñ-¤7¾œôÎd¨ |Ò7g-öHëÜ|5î«ØNPŸ_ae«”ðÜ ecRs¤xv¾ f.²L‘œ2ìWÆÃWÞzRxŽX¬ÄàÂg¯Aä{6æÕ‰û_,Ú’·”ïôÞ¼dé—¶÷¾ðÅ-p"^‡DÙïÔÉa—ean9rxPɈ3ôšÓ/.¹8éÅÛA½¹|‚} rYœé Ô Aà j»½øÂ÷ße'ª^… ì/=5šCkÛ¯™K‹>xdƒ¦¨ªFvWAC€lv/á£N—xï‡Í!pˆLÏ#ã­‰7nŸu„Ô!D-æãzifÿxe‰p…|0¢ÒeV[=qT‹®ÝBãp^ÿWNÂ:¹73ÌÞ:”ØI·o‚-[§ŸgV9šê[zLвATIý¡W‡Ö(®ôá°Ï¿UL~ðâímC\MWíÃp;Dz¹Ñv7{KMN.àåýÐT„_ï§è[ë«™›däR¿y6"›p…®±€ Ñw%ôCáiE³ÚŽ÷ÈZÀnŽx‡·ýÜr™o¦3qC¯œ=QŸ[ÕŸ‹-z æ2XVŽ….üH 5%§ã‚z+£cd@(˜Ö°€\9dÍr'¥c›#v$!û[2Gôß¡¯Ùjêqd©óyCÖ1.›±SÅ,Œˆ20.g‚ nùÓÚÃÁ°(+JfÊtÒîNÕtM™õ#Ÿßvι˜€Ûb€Ðeo“Êg g|¼A;d›(UÞ†,8†v0¿ûº Ð\Ï\0òÚ¦5Tè~P]¸0 e (|nCëÍô>âÈ ! ÑýÔ9FæŠwY[ W×`g+®¬•ØÕüF×¼—‹‰Tµ›†PʸâÀª:†Åz˜8JÒi~Þþ®¸˜”é"ã šŒ3[“[ Á¾ÀîB¯®IãzêW·Ë2‡ÛFÙ©­ã›AógÞ)wÛC`*/µ¦¡M'(Äåí þÓmz¦[ÿ> EjÎÁ¯Êï/ˆhØ¡Zm{”ô²øçžæ§]ÔˆZûð‚Éꫦ“¿3TœÖÊJAEcD)Ö  ¨]9=áý„rμ‰X{räêå–a*Õãu"?¡sebP©‡Ϥ±”Ëšï©OpLÊ7ž¯•ðzÉêFmñ«V°ºÇ5.Y”0dÏ€CµÑKú\Û­/]±^ÞÓàŽå@¸(ñß%$aHó‹xÒ!<¦Ü:bp'z¬:ùf €qMžxmg¥"NÆ%Å©ó­W&·d NÁq+ amÞîFÐ¥Ðg<Z‹·g¢iý¸K4‹Æ±6ÛC“Õ#OM “í°ŸÆ©Òú9BDÍÖ29xª²1S•žáçC˜°ÜŒQh5Úð¼tâ´›¤Öìw,#HÇOâbQzÿ—ñÍiOá} gaëq²8¹øÂ±T}¿}Ûä8%ç…K爲%¡z ò¹´ÔãPE¦žù˜8ªA„fá%Ë6ßóм»qÿ1ÔxÚ9ºÍî"Êë!cO»ÄuñàÜLóüÿÊù§š2R!µPäxêlDÇÆÌ‚Qbãçž|‹ûŽÞ«êÎrÔ}u;Áo»ç°¥ðÓ±U­òJlÉËF(tzÿÂf¾1¢‘ÁzøpƒpˆgÐÑ‚´+Mœ8»®½ïûÚ'˜ûÕ=¦ÅÌÜÈëR A¾™“T@kêzïrö2UCeâ³ Nݘ °®´|•í”´ ›t«ýxZˆÜ³Kš;Ãfh!­›N?ÔSL)íÓÞY1Ì\ë&î÷¥’ô„Q69ÄæÊ¿ÿ;‚t HØJ]®Ú1p†×D„}žxü„ä—O[ à÷lX{,ó™V4nÆrÃiY :‡ºõâÃÆÎëøø¶ü-è%ÇVȈrsAð=:T¨aUm‹½¨4£n„󴾃ÿ¿QìÄ–È™3ýí,+ô„.”©›Ë–¬?ÿ@óö©›2PD3Õã5ÃøkÚÂÍqP™·äA¼-ëÅß²\Ðb¤ŸWE®`Í‚ ˆJ³´ãº¶,Ä™Ìã±,'·¹ó‹µxÚ.’:l¨˜2O;Iࢨ ŽuˆóoªçäBºkŽjÁ6}?¡œè©Lo¢žÑ?Ý{górojŒøÚ…#’•[:`h‰°¾Ì+#Ðt—µ!5öØOz±‚)RiˆÁã¾ÍÍoû kÇ5£ô,åžj†e‹*ü¶ñPm&,ÛM(Z/3"ÉhÞ8*¼~õt¾ÜcœEЬl3Î*iˆ½Ê×+çø¨]•gQÊæá‡Ô’Øôû‹%kUªèï s–…wZ!Ì:+«DÚª(‘ŸÿÓ“+4gîBO8„NA-Jø!LU`´P«Öwa5ûÖæpj j÷V¹B‚Ö]î˜@Àþ‹y~lœ­A<ÄíAT<õðaAQoÕ¼y7j¿_âÙ©'z3ïΞt‰¶‹ÒÉ"° c@#S€s[. ˆTo˜5ÝV a~8‚_á}aâÍÝæ\Ûåd-áìüK;‚ 0•/ëN©$ÎrCS†B—z{wB^ ÛlFšÃÀÞØÿâ!A Á¾Á2$^G µ~â3× ÙÖ©®¶ÍÈZðJ×bYÓü37¦” Û¤ƒe§w¶Mç!IÎ9öÚ:0ö¾MllI_ÿà1ع‘Ÿcø±ô :FE…}iñ¿¨¹ÿÕäs÷Оçyr­$ÐyP¾ÂÁÒ´í}OŸ8îW¦Ü!0,]·¢ÆkŒ" LJcé¯dhüæ)°Ë¡aÿ_®ªK¯õ“¹M’$6±± ÷ÛEÇ÷ýÆZ¼âJíO³ñûJ-%ÜlX_ͣΠ£Âþé# ËÇ—Ñ.´A-”!Ü~GîÑ»ÓeW"F‘¢¬4ÏYh÷óåJùï<÷%ÇYVÝe-à&_ŒhFowÍJ™‡¦ŸQuÒêì¯!«¹ 7Îpäï7 ɤÉ2™\Kø9¹“±ˆ"g2Ò'÷†zJñgW™¥ð„¼ÄYz¢©Eœ× ÖT’´‡é“Y­Ä¯Ó4j^§‰:4Ùce>#FÔeu¦F®ÉƒßïN¶ JšÝÀÉé‰2…KÎ$}µàãÐÜfcæ7¨`5,ó6š`ø¦-wXÛ]N|1oNBdߨlÉõ¼‘ŽRQÄ6¶Cuæ±B ÅR¥¹sá•8ÆG—˹NÍÝŽ”l'¨|éaàÝ•ýóÀ–.ædÑñ räɘ‚ ±ÃcWÍ“°ÆÁ/ðºå3ѧ9Æ ¥¨o^ÉpKíµþ¯MÑô.è?Ò1¬ĉ„OPóÖ–(|…n|ÄØgLEÃëÏË\´çèl }“Äbmõ¦<½&Q¬†ƨ{áD,_c%¶çö“ T¸6 ͵ے»ÿ›®Ôø¦F0q)Ø_i Þø8]ü‹±Âìþº¢òw—v®æŸ:˜hA Gйöòöš>Æ+fÿRJzþŬŒ4ÏŠbÉv¼ŽqOïˆ]Hm;×)Èwér!±B§«t¢éÿE4Ú,Í޳> stream xÚ·P\Û-Š Npi<¸C°à.Á!¸5и»»ÜÝ5¸—ànÁ Ü^¹'çÞÿ«Þ«®êÞcʘ²æ\»š’TA™AÈØÆ(ncíÈÀÂÈÌ‘SQá03³123³"RRª€-‹)Õ€ö kžˆØ Á2QG°œ5@ÚÉÀÂ`áäaáâaf°23sÿÇÐÆž jà 2È1¤m¬ˆ”"6¶nö S3Gp˜ÿ<ÞÑX¸¹¹èÿtYíAFÖ9G3 8¢‘%@ÙÆttû/Š÷|fŽŽ¶ýƒ>€9~#0‹òoÄ`RùÀY«þFàjÿ npÖ¿8žáoŽgôbs‚/(«ßÖœ“ñ¿ ¸.à¿ +€Éä_œ¡é¿ ˜Îì798E37[3ðÕùÛ,ý ‚3µø§jù/ÎÕê7dgö/*ðÂdó;Øü~ù—œ©ío5Ø×|Ç[[MKYþ–þµ¡ÿˆÁÝ´ï¥Í¿ú~Ã1Ùýî"ØÂÎÉÆø_tlÜKÿ›Ž…ÜûApþ`' ÈÈÆÒæwuìàÆ8X8˜ýË ó7)øar4³þ»b°Ó¿ ¸™Îÿ‚à8.¿!+¸!®ÿ‚`:·?áí–‘“=¸;Ž^~àÅûþóEºÌÛñš×~»«"paØ矡ÜQO¡aðøaßîô€—Hó5ÃÝþF(q¨meKìýµàɳÇaK=\Hk¼bÛ£ç“^¬ÒÔNââ$öÀDÁ¡P]?!ƒŠà®ç³§šŸt d§4eŽÓ…<Ì;—> ׺þ²åÑàùÅݯœ2HOeÓ Qª‘Ú~ų”¹†™s¸doˆài1Î\Qg¯of0²'^I¤c齎¢Ø =47X£ïçÜW+TXºð(ð4q‰ ¯1F§¨<„÷“¤qƒéÌð(ÜÝÄiÔíºym—AOæÙlÉ; à€}›_ÑÖÜ­ÁKK½­î;c>¾ºÔøRt6Dd{“ £5îx¹ºI ;ä´O¢K¹Xt¡OD}Ȭâ“ûFÊ$ˆÓœ?ïjÔ%|a¨½°s) ¾m¤Ÿ+ïn0å¹ãÍÄòfÿýÇCV)êuvkˆ€¥dý·Tš‹ä½1ŸªL ò¬4¬éÃëˆSFÖ“‘Ò ÚA —Å! *”ÄcáGWü¢ï&„b¡kU¢Ž{îóÜÖ#n¹ÂAÄý}€ô-G:„möÈP˜—áw¨ô9¶ y‚®TϞħ}%ì’Þì'‘Ò\%Âþi|yé“=åX"5C »“~Ý^Nîû=ž™·¦½èö Øiè<ø9ûNÛ—¹xWZ½¢ûÚ¼>ë}üæâ°!)3¨jy·- €'ëòfÓÓ«í»M*\a"Ä[2ŸðÂò9 i£_â™7ÄŸ³l¢¼à;…RŠÆ1g6‹áFhcžMÅï0Œ”Œ“M!Z÷.ï³éõÄÑÒóm<1¶µ*~bÝÌ*J1½£pøš´£tõXŠ?2Æxà|xѢ×™v#5á£\ŠªÆÂ n¦òÝU1‘Бâп sbÿ$ñƒÒ‰\þ3+ÛnºßšeTµn¾E•ìOy%*’,Éû¥Y2ÙÞÙ·¯Äþüá·YÊöæh‰çHÏÐošg ú‡@1ïÞér˜û–VL¶Å¥’?K4(4­.è²kÉ%i7û£C^W†Æî¹rúô|ù¾5Yè k6—‚4 0çnt7dLì¹`jýÉ.ŽC²VžWP¸¼Ž’ ÄõøFÙëË{Ü…=Ïžf—vt*WU"€`³UC=¤Ÿ!\K\S $—,¼H"ðëóVu( ÑŒÐDÝŒg‚]ó,Lî3Éy»8dƒÃEÔ¦ŒîÙ¾ÏàÕZê(Déˆpj8Š­n<&$&ßSÊ€’hŽg!•mí#ÔjàP2¿-î™1ê~;ÿj8 ÛwsÑWçƒÁ¤ÊËÄCƒ»7JÖƒ¢Åb¾ðüY&º_»æYËÃ¥÷„Iu¼[,0GÄWœêÚ!ûrƒ1ͤ% ½óúaJZã‹¢¶§ós²Ž7᪩&|–2&%rX`Ë©à˜IÛ΀G<’ ê~¾{,5×­O8À5‰¦ÖÍèYØ2Íž=!4bÜÜœ%Ç…Åò€@Í.Í_ùÎ7ÀÙ•åËÇÁ}ûåNŸVßÙ&¬ ÑÅÓ4};È&çÐ2õ~ÒYhå,[ÈÛÊ7ÙÍìqä+ßõ_Œc#Ý¡9eÈuw,s?ØÊ*»ÝãŸjK@©›ÏEˆ&?7“›=¡:4kß{Ò^ìúiÄQPˆ‰AÖ­¸~Ø)Ãó´o> l!1™}ÕAeœ„Gm1­hɦ·/ù·znÕñ€™E±°›hé³ W¬5ë! ~sÉ[œI*¬£[ŸùÝŒÿæ×žä›^q~ä¡®ö8@™çåÃaŠ*ƒ¤·ë‹eÜðZž˜|~XÚ­Þ6ê:Û)#9^ü¶¼ ’Ÿ¸áÐÕü!Ú5¾íIR( ïžW•¯Ì¾´"UØC-Ö+¥büÄT¡>É0EVøV= ½}§õFl$|oÒ äæÜ.èjÛíš<:£[ø&•^{˜ùuí~›òLÞ\à|}AY) ò@ÐdzD¦Ká]ˆ)í·†A}s<31ó8múC7yKs[Š;¾?*Gá«7&^(0>NêìóÖO{’r”Or5chö¯å¤!ÆÐÙ¦c›“¾®ô^ô·ËØÇyiâ’ÖbíÄMiÄ¢d÷3(:9AÏ–TÈ Î팟?zùaäÔª>Já*{¤±r-ñŸC—NÁ½N·\£F,Úó„@3z“õ ú\m;fÂug`SzD ßýѤ9¦•œO5½5d&úrëY-¤¸.!" àѦoÖ7ˆš Øbm¹ñà·Éùë3IÍüܲޖÀ ®bfÑQ‡ïg5*¹+Ȉ®ÓOË Žé“fñÃ`Êž’ýªþ‚œòÙÈb¨¶  l–áº×˨øÃ¤¬ˆgIM¿iå·Ïå$ÜŒ‘± é—¸imÀ°ÚI:_ÿ9”^…i¿›S)vz/ò7±ÅÔJ•Ñ£ÏgK^ôÝʤ>´>ÝŒ—oâSœSw&¹‚o/‰p´ð>5å÷Ô(ÁÜ•n Á zst¤œ¡<[Æ1—eI÷e,úDM³%*ç×ժϭ§¥Ô•%÷zy¶”0p§üÕO:º<¬€~\ÃNX¶éZg'(í—€˜˜d Ò´àª=ë̇kÖшAE¿XZLç)¯Yw6«Å´ ¦ë’¯uÙxõz¨a—Þ“&g8Ge±ñì þô…•¿ø‹8ï(s—Zt¶Å2%ÃM¬‡–}]#”ë/²e™H¨[\ðŒM[ç@ØÛ‰öâÀ/_CB ¦%¼v‚p÷{Píks½oiÞ–ëðQ$ž}euj( à{væ»XWÀôÌ|’À·(Eb„Sø\905Cü‰·¤­]X)ƒ¦²Ô¦â@íWuï™òË._Ÿ ¯A¿"1K¤“;s¨L%‘Ò3¤µ)o¬G•óµEy?ÁÉä¶÷b˜õˆn\X×Áµ¶²Ï7MsÍïñ«\Ï~$¾wüNB¥ñù‚¡­’‹¶œà‚ùÔ5žfTìÄQ¤Ó…×Ô€Œ…£OGˤΒac_3j·`TÊ0ÚûËœƒË†JUyi‘æhó3hd%^°cðmã(g^3²wÇíB£@þbUNýÄwØÇÍî¸u‹Ðm¢ B{FšÆDËú›ÜÄAW½ZbPÅJõ)6Ö ¸´÷–%[‡ÈDá»Sž~Ÿ Ä“ö¦t“«”2Dß%ðÍÖl‰>~Ú…mN×í©ê‘…%á‡aÚIÌëB¹î–9Aû~]Y] ?¿1$`ª¨7,…øó¬õ£Â×¶Ö¦r½÷)¦‹2TV}­ŽÍî=O•ze6H úìÅîì Q\ð,§Æ¨‰_\J´]‘5³ã>@×#¸i§¦)5Bä­OMXBŒ Îû.§]®ìö4ÔSÀ”|=#"è1 nò˜õÿªÃô–±4ŸÚQ>9?‰wW­÷aÒ`y«œ»mÇßübFÅåtY#q¥V²/¤7ÛÍÖ'÷tÿsÓ»G7(ÝqŠ9¤ J‚ŠïûàãìB¢×4îÙÙZCoÄösàPÑéêØĨW±6œ¡í4ëŠÂ Zäk"}Rlæ/À˸P&y_èìVU tº‚C<ˆyýýX²pX4-íÇ ˆ€Öm!V|OPLRÂ[IëJ‹zü&¤¤Xé(=76]ôX£±;/OlG”v„§(l>蟼,Îq‚¹kèbÓåƒ#¨ÈoÓ°òº™ÒÄŽ¸èPôfé¸zTˆfaS†B™ò²½óYãòÄ;‘áMRé—4ÊUè?HœåÃëñAƒÂÓUVn=a}z,óìŽOýçÇ9·³–ÉÌ.I¯ˆl2vˆ*?ïW&¢0*G{µ+ g¾¹ŸFÇY–…èPÂØ>›f®pIÀд;þ¬ÖÚP ›’ÏíX|ñþþI·($e/r™ÊY?¼üÉY*Ä ±?T#Ǭ¹ä9ù£=vM'O7€EùJ^ähƒÂhwñŽòmê(Ö5IO½J®ÜÖð ‘O«Oj¹ÀlþÄ»ïÊP\›Nù~‰z1(®ȉKG<äš –á2Ë $7äÞF]OÅǬÜjÙ‰P£N*¼IIë8šx„‰’áûAO3 n/î*r—×9JºÔ]«ÜÄ|Þ÷Dõ¹3ZT:ÍŠÃuzãµ27“Ü+çÙtG„^"ý%t?›úE<„puÉ ŒêãÏЫ^8Ô òú­ÊNÂ&Øô™§s‰3²7³Û—Mü.¨VuÌVjðh³;I–~©H¡*Ÿ¬ñò9äÈ4F¶oüì¾íˆF›0[9p õe¥é¥ÅìZYKêo  - [M§µâ!ίTÆÄæ%AìGž˜›Xª..§FöŠd¥·ä;61E®ìõí¶C\8/¯,¬/)ØŠQÈ+èêýò7¾ßw®i¾)&CUɆѼtz–´£¹Lû±xra\% Sμ6î›ø“äã¨WF‘wmrÂ+ÂI´ßNg£ô‹1nòu(g‚21çRi0çè²F)'ûa>ëó"Ä$‡Wq†ÈØÈ*·%ËÏÇݘ)˜m‹ž-5*Ŧâ2tVµà+_ìFîµ ø]íÌ(x„! '-K¦žÀF ,wžÇ!¬Õ‚þÐ"†3Øëá˜'é!Æ3vi…;P§ülÖáÃÃTïÿ±J³„8+Þí!Ožã1}ì5,ÀåvgŠˆ™b†§Ü”÷vCßQ³ˆì--ö¾¢•ŒÃ'ËáYé¦4O4Î(Ð…}¨Ø¼¸†©éxÇ:•ó𠤞TyMÝ÷UY%ÜMÚè‚&XÅÓ!¯Nijô“qde”z_J‰¾Èޱ;¯´öü(uöímÓü~M ‹¸37zò¸þYðN6< ËÃgÔy½5–Î.b\žö3vüHçþ„IW–f‹8¼>œ(ŽÀÊmŸÿ24DæWf4rêWoPƒ£Ç´õ’upk­1>}Ãv{ú8ú¤}è‰cìzÝÐm Ã7ñ• Ê"Œð‚7¡â–xH²naÐ&»ârû¾zyþ«´ÝèI‘Ä-‹P}Ýøs­Û3í‰=‘¤maùÆÅȬ([ãé( ‡&² ^;õ ²èd]øª-f tS›ÀÓ¯ꗹο¬ŸÆò„—»˜Œ³¹ä¨^ç,ñ×r±QƒÔ‰Ìêé™Jj­ž‹e®#ïµqB1jaÈ5ç! …¶šÒ²°¾ÂìÜ´ôš<ù¸½Chý ôˆÊ}Ø·ç›Ø"ý3z6ìPO³¤qÎÙ6@Àòj1ËÆò“µÚñŠà=/»³Gv« ±pãBªçÆÂòÕ†áWRbñ÷î»P¹{Ù…ED¡qµôUƒŸ¡½F?¼Q`ZØ„EÏü¨ƒ¿ÍMÏøJád©Gº¡ ä-Hí"æ—OÃÐ>z6‡áž˜ùÌ"æˆÓcQbn]C9¢YÙvÍkæäׄY‘Uý7Þ-£Kš\䡪„Ðøp'Ún u Õ§®6BZ–Æœ.üB8lµž§Òè1L½ÜÑ(ì@Í}¤h"š=—e7£ÒžãJÛéä‰2«ì±œ TëH„ƒHX!%¬IÐ5"*þÊ,Æ-c·•¯mY‡ad‡Rr­'M«9sƒè¢=Ùg;8ý<ŵ4gæÑíW|àbEÉóÓÙ@_q¯AÀ2€bwî;Þ*¨vÜ¡PûÜBö¾…¥´ÀÊY¸#t¢&în·ýÎTNé\cë0íù<ÎzG †°õ¼¬©ãÉHžUÐÃÅàMÕ9bõº¨'aNØLJ¦žÕé}J„$f1šÎáÖDVÔS¿1ÑJ_Á‰–­.Ic/:ú}Ô]U™2±(úÄ&ûæò¦´×Ì7s·é9-åycʳὔW½ü0g¹´˜«¡[ÊyÀµZLéJø»ÎîyÕ¨êëDéï!üÔý”²„fÇ1?!)@æ_VÊö4v´ñ!Õ?ÄÓY º´©l“ðÀ‚ÿÖ¼3Ãj°~VêöÙK7ò.I˜õ­|ül[*êÂî¾{V_4±\äý#B"{AXpʯ} Y§ý¡wúcØLªbÉÇDúÖ¯`ê6u6Õ õÖ;¤“ØtUöâþ‚¥4Lì×à þ€,'4?‚&‘û×;Xm#w¼æî³êO¶'v­ùþ}Ìq쨘”Ïâ!+žáÙ–o©e’qûñ¹wJ‹ )? ðîVBžÐ àn¦Îè¹×lܦp°¬µ7ª…ý9¤_œFx¶D`béÃû±X]#ñË–ZTÕ“éêØŸîm:¡ï`áXçRô:)u(PÙù×§0ÂÜ8ⵟœ&ß 6œpÖ7U¦ÐL¤å·ZÛëâö‡yj–>}CBmÍ¥†E7åS%zyvOαUúöEž$ì@pàÆ,v5?pûÇ{Ó8¤Œ[Ôœ¨ä±/š+{K—ž¥Zõ"UÉó î½âúu¸OÞ7}I~ë®…gBÒÕI ؈»ÆkɈ¹aQl3lûÈ(có³8þQqW·—°Ÿ¸ü$–•®ËiÃr7;:ZîäóÓÇSašMh+xÃBìz‹ê‰Ÿœ÷ìº.æa ~_SØAi~áÙä·×it[YÃv_%^ºy$cñû.…8(ÛˆžB>$¥äúîÝ'ה͠³'ôךµ2‹ýzÉ ®×ï QH~ µ<ª¾‹;óÒ‰UPÕÞäEÒþÞnçæ–[¾Î¼|YkwLZG%¤‰šØ¬K^AèU¢b¢hf{Êê„SŽ&T:pÿl†«ºÀëèQÒ†Ž3ï“óý 4U{W}rï0g„‰Tm·ûú“­º&=á C¿Y›*E‰…]3žµ _;™Ž©€x¾±( ‚6¯öð«Mš÷7Á0æ%œdi½ï|ùª–-"×g²#«khäØ4Ó¢Éö’qYÝ^é /—G–QC½ÔqÑ‘†€7´g¹ÃgT¥²…ŒÓU‡.à Û£—Æ;E»t¤™¾£ì HN¤ÿ‹îdQæS¢Z»84w «ZÛáE ë6¾ÃÇÚ,QÊæ!%{ƒ[FPI [}òQ ¾~~ 2¹¾ôðJÀúºqÌ7tqì†ëÌ4OŠ|ò+¡æY2_u›2x¯­PO÷—]E¸Xˤ»ó§|»Ð$ð;+Ù Í=X­ ›ÎO…PÏ軯…ia•—‹¡X ©¬Æ&t'¯Â]ãq3g^A|ízD½#±L`¹ŠàçÆ­ñõ;$iÂh„vH£èòd>ŽöÙ±¤“_%5Þn ‹zE€úàÓQrçrT³[”ÄlB÷B/L\€&¬xѪQ+ö’Cz„5;P´3ãp.ƒN©¹I¡Û–×y‡¹¿Æè)A\ ÐUoâ×cÐkÛ~‘„Ê¡çyœâPaRA­“ÀBÔ¹>Ò]Y³·"¶åÓ¯uwsZÐf¥ʳ֯ÍT/i²IPâBµ­yÊ*œ­|Ô‰¤û¡|Sçk]Sû*MrÔ!W%Ÿ’õL…£9¤ÔÎï!j`8} 8ºPõ ûSO“²p½è [aÄÖ}zgQßc„+h›À JÁ,ÔDëGJOC§*|‚–yÙë½SÃó,È ½ÑVïVtð׈ÑR!¯Cì¤8!˜7ÿÆ EÙp°'ÌRAl3ũۈZ2ßýj¬ùÐiK§ BÄ|-屎°¦[¦p­Þ0*Øœi.û‡Ø¢œÐ:ÂQ;ñŠ%k‚ áƒLg,5øqéi‚RúêóYKåA¨s'Bx`1dž†]Õ¯ø²ÚPù §õ=eïæ.£´aT¶y%)Î ²KœÎL·Ý/uæ+ûÍ}_g¥³õïÀáཥ§Qåå'—2Û/ÊäÔÅk|ãvYÔí˜lôÌŠU'ÕaEØ}¯¤O²¬Ñèûåfmb3º40 eR~ÚÈF]JÎsºÊ{$¯ÐAÇë&~ÉÀ¾i›òüÖ²°ŸúÝÔsãÜós ¼g0ëü@²K<©ÁÀI·B…àÒH1(ÇtÇ„sµóÐÿüzåv“‚*Bwgb€!Eû&¡Ñ®¼ˆ%ï¹ dLi¡$e•Aãâíòé~'!"o}°nèFÊÙÙjHðV»­}ñz/¨é"S˽JZrÑîok×ÐõP!ûÑ%ïŠ@ËÍ0E¬‰OÆ{ ñ׊”œ(®ßx²‹}-ÍX@^àûv׋ËqÄì]¶0E!Ç@‚¨÷‚ÇRâäyýè°lïÓ¾äçá#N¹Gj(Mdé7¯^ŠÍ¡†èäxQÒû„¸×¾Ðœù×½šè`5qß ‹M5r¿Bÿ€ ‡Ý…a8u86:œªÖèídeôïM¥eÛ›m¯w?õ#ÚçÀyòFr‡æ‹ +@2(0J”·}œj4gG©E»¨¤ÔÅbº{„ïm… Qb‰˜Ú‘°ÓÎ9)޼ˆ-Åzçç§î Û(©¿}þÖï5ÿme2ËWÖzGÏ÷ºãºy¥âUÉøÓPÞçn[b4ÉF«¶”A+ÿ@uϾŸ™.Ç÷ݾOÊa‹^¬öï´$Özþ “º@pÂG 2—Œ*CGˈ±È5{å4®Žkb} ´ÔUõ‹o-óÈ©Vª<8Ú—££,3î€d»[s¤Q&͆yL휪 „ʰwˆ“©¤wpìiþ¢}i*T^üXæ±ú¶à¸ùÙøÀWpíìfšžÁq¬&4 _kvŸNÇŽ`­Š#hº‹H&ò8s°õ˜`Ä7‘ÏN¤¨¢óOþk}Nâ‡XÝ¡´¯üÚèÍ.Ȇ³åô Aò0RP›{èm 7ñ·ÃÒMdÔÁ\ÅÖ Ÿ†/&˜üŠñÑ#âïµeWÃs'ö"º­` Ù¯wUVúz:§lA8„¿k8â°ßÜ0²K½Sà7Å_ìÁ×Uû>bîS+vÐY.´Ërnf[ùdIÃw=Á9~Ôé:wl˜lhºOᑬ–³íx‰âý:ýÜqy¥Ï«%TÛ~^EQ…³Ë-ÁÊZ©6×T'Ææ– át ±«MäR—ˆVPrú-| aޤB ›h|1š÷< Føpm!A%aY®BJ5R6T쥎*‰'ƒ®€tÉÕÃhwê´özR”vh·Å¾ºzž»iv$/Ó·´Üzó€+…ò)·ì uoƒvÐbs¯÷£N:ÿ9Saÿ›,Ôábƒ}vꤶÑuîWŸ¸~…-ÉòyH½³EA.PËL3•XßPöÃP¿î/j¼i‚-I8ùÜÆÇÓõó¦.AÉkúY»ÎJs¼Q>-›ðkŠ˜Ú°Á-Ðïs J\¶n~C¤³Mû·û7å[D ò·µßCuk܆8’„ƒ\\äØÈ‡5ÑØ·ÐXع&;úy,o¬²¾h`f=8¯&gKìÜÌdh‰Ødú–ù’nX=Ф½“ÒR*Ép7,à_ß~”Ò̫ѥ,þfI_]ãV%­_ï½\ï UeªrXRÒÕ4<»$„ê¶Eà®ßÚR&+I‰I<‘Øé¯“…Å¡Hž¾f’yàSw\¨ddDsbc…¬ œP’~÷ÑðCÉcÏpß#É»‹Lë•.w9UÕ”{Q²© ÷¾·¬ï™¦ëKò ò¡e^;pp4nîàÇ ‚ª5*\ê´ËVªÉ៴ªk t˨iÜÝ›ÌÍ@›‘¼tŠÆ¦žˆ^"!uz•°ˆbý8!ïoÕÀëþ&ð…—“$¶UÎþŒòõIƒûCDÍÒÈnNw0\¯÷óÛ'}˜L¸„„ q†ÊZ&eÁD5C£àl`Û׿ëÒæ@"[!•û´¥[òþ{öÑ+Ot¤ú¹]K˜ê=ª¨Ü“È䚥x—HñÐ Õæ&"ÇÑe†îe·ÚmÅ£­5gU*µvÆTfýÞŠÔeŸá’ÔØ¶™Hž Gè$?6a ŒZì•§iijg¹X'2ºGžpÖí W›û…^Èi)½5±u+}e©-.e$J^Iü8v¾)4œñ:ç°RÄ¥ü&n_U˜Ù.Ì78í{­ hL±@I¾xÇ‚Á7ÒN‘¬bÔvú|S³²bÆoh‚œœ A÷΂°yôo„/ÞÀpÆPÉt쮕^ AMEd´$ŒÏ—¾ÈeÝy‹·tÄ¡k¿ñ` o5Rµ¤ƒ8ÝÁ˜–Ù?bKô;¿—"}¨ËW1Z¸QF&ˆ¿ ë3|{X0yÈÞ”w-¼Ö¡ÌDêÿU çLº”«‘±uу ¯¿n¨þŽáþ¸bôîvÖÅCéóì½)LjD}F›Þ.”ZîÕV—#¶Ý´"\ÂÑ(È¡&ÎW›Ô²&2‹¾ã·La3-AgSµf=ä ÑŠ$/Ôí”]k¹@¬D¡ã²“ó×—.Èÿ´ºgÓⱺb4LjYÅv¨&mè‰Ü°Ç[ÎÉŠ 瓊ì*¿épöyÍûŽSÏM®VÖœ38mÄòXçZRA›&êb§¦ðÝ »¢Ò'Qb,e Hµî’sHªøÐmö´C«QÆÅ|ZýÃõé½¥³€âh°y<–ñÎPw v½Mœ~î÷éwm©%aʬ‹w"ïù<Üw^Æ·?mÉY@i µ1…áþlG“ ’º *ò •s>w> R—ŽB¬±ðÌ@è=`³Ët¼wP¿º®X~&®yS"?©>¬¦þë=©|vÿ¡âO¤rMhe[ü _Ñ9£`W‚Õ»% èîÝ—>IݱןGæò2µí¾Å³òMÙ‚žÿ¬d€(÷Ëåkµ­èÕë·Vá5É´‹^áÏ’C +¼k81«Z¢ÏáÅV-f£±'e^{番li ‘„&ýDª¿nf"aîQ–Ò¶Ë“izR›Öh*‘nçȧ¬¦©ÝN×={ñ|+d6èçÎE¥üŸ\o¨ `„fâò3n6û¢'ç#ñ :¬ù˜ÄìG´îž‰C¨¨hõsµÈÕ›B Cžüî”ÏPt5”Hü_´w¹½M©lÚ`~>#‚ªë{S^†~ñ½ª·åÓÄ8ŽŠò]º]zI´!ÔѨþ ¿Q‡)pÔ9ðš›0‡_¾ƒÙÄEòIÕ$7ƒ”ík:',® ëY¿“„°M­\t) ™{çÑ2Q{5æ7a±X¿ùO¬3ž\]—þ{á¶à§nSÃW7Âo£.ËcéPÇ(¹äËòïzêBiö±f'ÅF,ñIvÜ&ECöü/7 w×ÚsÅñ §Ä4M Ñ:§.ŸØò\Fèqød^÷oF¬\](% †!,¤È\õЗsaŸÞ2È¢ÖGšæß(Ýum¡Á4ˆN‡T¾¦Nû›Üþ æ/q»­<$˜w¨‘¢½~?Ûõ–ù>êH"º×+IüŽ˜ÑË­vdÃÁÔ»®Ç»b]yevríUòÇ%¡ŠÀbÏ(Á1ýŸ´§ú;Ë|JêtuKZ©‘nÙ-…I?8š¡µ1—"ÕÜá£ìiO#Y0usÑ¡\оêw##­%¤Â>Vö7RÌÛðw¾eŒ õôÔ¼üQ`…½ ¨¾½“žoÔn±.‘^È ±o‹|I\È*nuD¹K5ÎõnF‡LÆ¢F48v_@Ox¡2K,w‰®ÒL°1™£Ž^¥Ò¼½à,îãL•—–Óššûi˜Uv¸—d¾¤Ô˜®™©+«bü1Ô*‚ï¬L[ @7‹2è)óˆVI·•AŸ4f ¥Ó¤©›’Ó&×)#iÁ®b¿Ï~éÊ®»¿ÚéOƒ ÌžŸQã%ŠÞˆùÀ5ÜÞFªžñ³qݾ‚I¬¾ù­•~öUWö*#y,\XoW•QRcÒgyosšH7Ž»çÍìO3¾ÈSé"ì·‘×[ü…È™ƒ J#þ9XÑ³Žæº`˜E…;CaèÍLÅŸ.Ó‹".#EhCøOɦŸÞ‹¨”ôè‹ybC¹ úz›Î“®JÓ! ÍZLom!еÞtþ<'.úÙÄV#8מäÀéŒÄI¿^âõþá$(aWqÒ?ðÈ8¦ê[@×D«•£¼—­ñ±»¢¾¤—3ä¼@ßÄÿãÇd,ÉŒŠ}hU^ŸÅù¦àälÓô‹€ê÷Éqã,³' [ƒplót½„‰Æ0r¹%,ÐÍ÷Àò¦›FŠ¿>à×Tˆñêr9¨NU£—ÌJ: 2¾°…:ä’½`ßq}JÍ”ì\¡îç*P#†ÅŒ²ÎÝP›hj$p1òþnÛiD…g9ô„‹LˆpA]ýT‘\CN“^íV˵„Þúéçv ¡&¶EŒýu¼,qmaF4|IÌÚƒ¦ŸÖ‹Nôä¦`”)Ü)·b9?’ïŠÓë ßÌjQqN`g8«ÕùPxÿÖâøÒÚŽb[ƒI¾qXZI‘Û–-­ö½ °"N±q³/Úà”ƒëd;…ýËVd~©ZS§1 Êä;dB>–´¶“-1îG¼¯]R´z˜[M ß1J{=Å’¤0>oL®f"T²Ûž@ çlÛóJèÎR@ˆ!Qe»: I[&ñj¬¸NrG œ©]n&}uçe¦|êD“ÎÁÌòô†Â”;-q]7wÌìÈTÁ Þñ`%&å'‡nß‘NG%+RŸòÉðÁŒÅà]M;›(êÊnk"帲6Üéå[ây•0nèFX¿5 öÈÜ„x÷æ9¶ˆ°ðÀªáU²‰›£Z_ oûB@(„Œ9a'»lY¶A4’T½Ðp ±šÌn¦þ2ý&I‡+×Bí]_ÙøÅë³ÏèÑ1úýdž2†]Ò§Záƒ3}è©:Ç ÍÍ%L¢lÓ¯,uS/¿˜—:Rϸ3‰ave¬µžýe…`d«SHæÍH†W¢a`r~1mÞ“ëHÇ„ÛîDÜ'ô¦s1kÆ™RÍ£‡×S¯»¦ŽüðŠÌûö‘m°– 4hû%óòÅì-ˆ¡¨tžUžÇ¡jÐë…·YNË”= 2W&²0)î/õ’žS@^ ˜_%Ñîf6® ²ò±Sà`Žšéœõ•N·–¿à  áÂÎ)8×je.‡ ‡Í…SyHµÙb…w™l§#=JûS›W‹ðk<ƒ¢ÃG,Ü—Fõ ²XS ‹ê˜õ¯:K> stream xÚuTuX”ý¶¤;”Ž—îîé’î`!˜a(¥QPi¤E)¤» éî)éæòÝósï9÷¹ÏûÏo¯]k¯½Ÿ—™^GŸ[ÞÞͬìõäæçá“ À&Ü`_W?ÀÇ÷ññc33@<]Àÿæ|ŸÃÀ OˆTäùèÓyê ( ð‹I‰K ||ÿŒsƒ=¦;º¹‚à€¾#¬£Ú {ô)ºÙ!\ÁPO}„»» l¯†»!`v`¸àðÈéß;vnP/0Ìl€<Á0@Þqù«Í#G@ Ã@9m}’=Äx`sôôt—àåuw1¸ìÉËŽÍÏØCì<[ðK›÷/ |ÝÁÀ# vø‡­ò„A|s¾¿„øþúþõ²|œËÞ êâû?áÚ W0À«ñÜDKÛ„óKù¯·ÇrÜü¢b7¿¸0 & ˆ‰Šþg1äo2ÿ+W êàð üƒ´=ÂýŸÄ5?î`û{aìÀ¿Óv󄨶ÿ_¾ÿÌPF¸¸ü÷,lCÿBüá‚ýŸ`+ÄÅ÷ÿ„ÿg˜1òÒÑ`ûª¨y‚\ vòЗ.ÿšW†ø€íu žvŽ€Èþn}<¬ã‡üuRòñý‡ÏÀbç Ãá€ðß.°+ðö·‚Û=ž öOÛü@ào µÿ‚JP;7{ô% ,€`0/6ßã© ¯øÈc_ìóÈ”—êæù˜¸#<ýφý×®ø¯†ü†ýouí0ØcãÿÞécÓÚGÀ`°ö̤›d˜SyXãe©<•7÷Æ/~Å H!šBªaÅAòÐÎuøu›†á¶M•ƒ„´^ä˜Ï‹Ÿö~<5\J´ù“Ôùà0®ê/_Eq»f[lû@m-yà]cpæˆÞ&ÁÄÊ¢dê/÷VéÈÊ DUÙëcYåÍ§Š­³wï4ïW¼PCpšÍb²( L[óðºFH{‚Ü¡ü[L, %´/ßN‡“óŒ±ö—J‰·eÛ0ytÄ'Õ8?Û{Ãò¢~\A’‡Dµj³è^Ýèž´ vçéíe2A±³ë!¨é-7{ÏGÓ¼…hs䕳³³âévüÙ ö\{ߥeOÁõÒ³ïyç7ÂVÞÅ’æ|Sxdä¼þ8Ã|Ç4쓬—ök!]m‡À§Ì¨yÀe¤ÚÆír݇°¹t± 2Ø"J€U‡‰› αy£×ÓˆUBaÂH\ŠÉˆøXëcm%ôà›ùöM ‡t???á¥ß˜P,nÁÙd3§JÈÒ ZÂÖXΪ6È÷ިʞv D¤â8¥—F:ŸYbBç_ÿ”i¢1áñ,7[š]N  y’=5Qܳ~Ùá™:6u³(OËË] y©k²½"ÜߘBW:‹Fê‹ô;ñË«§Å @–oŸ2èÛµ%Cï‘­0_¦=EÊ+óøó«* ÓÞ|a&Þ-aÏõµ}_’‹x:ÚT½²Nky€or)râÝ¿;{Là\RPÛÖ“¨ÅýÀ/9o(Oÿ„7ôÃï0îU•;§ð§À*šdðñLÜR8—Øy•y™ÚÐzÃÞoJ’Ôjà[õOŽHïáoÚ…C®rX1òaÚ/¶%†”¥t©hOo˜±{”rG4¦7È å ­k «[%áDš;ÑûMØþëè5¤l•ï¶K|ÓsFøP”øˆº=ŠÄ¥†uc^Ëðt¦Z漿æü1œrõ>Û:<€ V¢—àWkÙVƒÞx«æw·\ªh=ĸÔM£*˜Lc¹íð@‘_`ùpÃG³û¾l61ׯëÀojð>Áí3×÷É:4›ñ[9L =\±Ñ€õ!dÍÚ·ç€ÒFt{ÆGÀåUÐÞ©wÇIžÏ2ºÔd“ ÌïÇSS÷ç…kÒ93œÙws£Œ¼º$7GTý¨,PÄèøH]÷¸µúqZÀ3ü+Gý4 W ©Ò>b>|·6T(1Pqoýìçj6f|U†4¨”†"ª0¸‡1½òkS‹ºDIŒ-ÁôöŸ·£‚­ÞŒY œ‚mzJ¤¾ð&tµoæ¾ÞlÙLdÛûX|îzÝÃw“Á1ÊÇ?庖Înøª6ý*ï¡Vh(s •³÷5õ§v}ÊáÌÎ,NQ͸Æ;sdwpv{iæ÷ ¦xý›S…±eJĺ-2_¸!Ðõ;Xo»'ÎRIÁæBÅ;zNä3%sáëb·®¢~Ë|7¬äR•A£Ý;£ËóZ\[Ñ2õò•fˆ»Ð$½„/+NüÃøœ(­¥¼c³Ï*ðõ(NÚ† sͲý>²<±ONŽ´^¶Ãl†p‡´ÅðÖb|N&ôPÕÁ ÝÖ¿}šéCÑñÞ)¯žkmü®:§ø I&ÎÞ!‚ïËmªc$w$@œ¼šK%:qü«L~¢¥Uù«NÞ¹¥ƒû÷9.ùËâÚ¢‘Práu“^Dó§w)±sÜä1<…÷%æ—,Ïñ<°MÍâ„n~ýê$s(×ù[`m@…_¶=¥üe™CÇW„»Ó×ôœKc¼p–xP¡µ3µò{¨ÓÇ|aeoÛɦ{až‘~=c²3&ûQp±5ç3~YGáà„§Lù)öSë—n-”wGµì‰ÓÊ.ß$â“ dÃê lð×#×ÅU2mÙІpñ!C'Äצ—Ø‘ëÔ*(l]ìZ}fÞ?ª5žn§§•ôK+q ˜9dкAb¤£- Ó]Ü­sÅ·‚¥òÔ=,®Qï5q—Íká°¯k!%sËâéØP#†µh]á»8Š“"îaNÒ¸O´’ÒÌc¸á$Í–—o¥P UrGƒäð ó} Ó¦,äRd®+ÁM1Í}ËŸ+N“î> £q¡VÁ+a!óòfOQ§‰ÄÒƒmÆ´Z{XÝfC¸û=$7–ÙµDï\„f¦ßôÐ…2²ÈË8Ý[މœ‘Íw›°o{ûŸÜTX·é(ákõ 0}Þ¬ñBÁÙ"¦ïm’ésÕ†Fp4¡•Õ9t1?ÌH³qôã É?Y«´9AÔŽ ]õâz¾7®$N».ÉFp„ïݘû„' Ú7Ã/v“>¿À"ƒ>±N™à÷‚õ•'kqêTøúw3FÛP1\JÒé2"êÑŒÔ4•õîs‡uѺ?Oó³ÿx!s¶yý‘l@£J€ˆÇAmZm½bÎïâ¾Ê/ÈÊË»¦)v6Zõz%ó”Uó;¹ÏW÷†—õNK[|¤ ÅUJªÈœ¹6*y¡Ý.òç—ÈÃ’%é|f%?(8ö‰¬+Kºvg·“³b1€µEö%Pcm@f¤‰g•ô®¶ƒÉT­s‡d8†ÒVl›ß!a¸†õÓr|ŸO`Ý8%vg`%‡ã\€ØxeU;o1âwÇJ½y¶ƒ˜A4䛜PaD ®X`”ÑàÅÞ'ŸH†_Îú‰~Å‹™#²ø²Îæë³€ìk‹¯/Å.ÿøßÍóæ~'N/4þfÜv%£q&6¤wJù;ýºkmYfïZåDÛOYÙg)BótÁ…añ¢YðùBÙ5¦~9R­ûÚݸ+]3|€—lA0Ìrnü­ËÍ“\åm&¿Š×áëËäÜôÔ_ AE¸t½T9SåKs =¦Rö :#©ýÚn¿ŸÕAÅ:`u«y" ïËïí&lbè³™(M (NéI|@Á°Ù©ÊùÍ‹«XD­’¼ ùPt9zQ7qÑ;Û® 9Åé´ÊdTÃËðyûÐØpô*9ÄϲdšiK¡:JM^àÀ}Ÿt“]QˆvÈ„‰ì¨}Ùä÷ÊåVΰk5ôOæMÂíh óz켄¯’Á¶âè\ ½Ó”@¦;#¾Õ°/­‚¹»•ù˜ˆ£Üõ'Æ.•rܺ6í(-¥ÛèŽÖYÆ?Xö5Ô*PïöV(*CÉéîÃØ("ŸÛ¿ðµŽÿ¢L´,Z)lòú¡­}¿8jœÏi]Ûäu¡ò`€ë®ê~TæxëyTnPÉb;‚–=Ò"W÷dhî°„šçV½õW'é"w#c“ô¿÷¿,ðË @ú&Z´Q3v's¾ Ç2’CÃÎešDÒ•nQ4H˜yþšoA0¥ùgè•\:¤¢çœ2ÕF¡«ø]ÂF‘ªðÑ^BÔ©ËüÖB{~s»I?ƒ¢˜6§f­ðíƒÜ¶™pæºìǽã*z£íâW(ïÎH²ìM­¶)æ&ƒín~°$Ç6Š©ƒmIcÐÇOǵ3 ñÃ5Ÿ¢¥|øx™†{‘Uôƒ®ƒìón(’˜Ix©ÇóýWE¸Í„’ªh½’#‡°ïEÊ0t0’Ì¥kd~§Dˆš³xl–‡Må½M½kY±Åûôm¦ÉÏ4–únØQü?†ëŽÅ÷ÌÒŽfHhZ²Ý±ìhB“÷:#†ïØfË&Æ(‹zBYñLÛß :‹ŽL5«³2l6uN9_‘?Ýv¸ßpix¯kDßÔ‘~»¦%bàbÑsfzuj Âýë¶+ / À>¤ªR2ÿLê 4ÁÒ“Rµ5©Ì ¦æwyfî-ègoGÃãCâ7¤oéGETV£Ñ]R¸çΩt2öîž ôZãNÒX·o½<è÷ll=½>J,¤îÞʼqoÏô-øŽ›3\f ánš#2W‰>w€üD(PâYÜïoDÌófË]-LU)¹ŠRÒ{ °wËÝdçÂßWR®IYqŒ–>oÍK8¯ž+âg4¤Ðû?”åãyÊc—þ ­Ë29Ì|’›ç ˆ1±ªXÜã%|q¸, Ÿ>ËD›J¼ãoHF€ö—\|פ,6Jv&³ÌB½81ïÈɯ¨gpbã¾P0Lí™EÖz¸ŠƒèLÛ÷i†\Q ®åŽ{rÞi×À¦Ê›–8)k ÏǹþNþ\ØfZ–Á‘P>ÏRó¯Õ“éMý7D¿>ô*·k-P'nVSv†Õ,qÝ®–ß¾ED’l®+-Ü ƒœ¿j´stÕTßœÅùKKš—4µ`:‘ûíe»V¾=]ÓE0ÝR…|½F×a­K±ž3ÂR½è$ºygmÏÒéLò”‘uS]ý˜ªí‚$?§±ÍÀ/v–ÔI³ÛVIÅSˆ5)IiéÞoþuÑ~b{ýØžc×Ñ™›åΡƒåªÒ#îÝpQ[,¶Û눟à_GCðETðêÓ¨ÚŽËéî©,.NqO]@¥Y¯ù3íýƒ«×¬×eG¶ý€’ñt}~ZQèn]˜Þ9õ1+)à~è/§xm¿:Á°E€f¦V=‹g“¤L¿[ªª(ýÃ+8«}ºÂð†(O6ÞaŒZ¦VÀ,TíL¿4ÔÍízÁíýª"1>Ẻ—¥9âØìò¨ Ø{›Ç‹ww—c‘÷TG¸‰Ü:ÄeD¸ÃhÎé~‡"{°QeÃSª¯éÒÛ+0Lj­Åµ9š}CÈùä‹3mæªØÌYï2u|ùÜ•ªÊ¨¾…Æ”³Q%–ëØø¥Ü4Ò$Ý UÝ×fbQgºÅ,oO‰)ò OÐ\_÷Qq‹í·¿¡¤Yøá‹åºô¡2èóöêÀa(ã uŒ£í›ÅEÖwZ¥¢>X£öÁw£ŒKwÑÛ­´J¸é"$ýð:B× #þèï{¼Á&¤öG_:›z²â·7Mü/¡«Ó> 3ÉWò—Nåé‡Ë®Ìë%Ðõ3ÑíúƒX|¶>ŸzVH1…·™¥SLQNµ¥àñ|žÈÆ|íô#Q†žiÂÓ’ÔÄ¼Îæ1üûÂPSÓ¨‘Á1D@TŒ#²,óŽó ;&ý(^'Á,Æœg¿ŠOÝÏðØH¬ÜI¿A‰5üZQýìnGÑJÆ»2Øã„Â=× Óåe;·‹òmtÜ/("zѲÃ0 b,C¦_¹ŒŠ WwhqGI}ûX”F6¤-eÃ;QðÕ‡—MÇ•ma×T§ñzñvؘJ2Ž|ãmLg_ËØKÒ²K±­.l1ý4½Ø÷šw'‹*WÛ Ž‘«‹ l,LjSi7êöex'2µ]§i›Q¿já]ÚLNŒãñï31Â0¹†I—Z%ó/Úßšù;0Ÿÿ ¥¡¼THS®|¥›µóÓ'âP?ŽFZ8àHBýz-sý>Y)¯Ÿª1FÐhþÌû÷òÌXLÓîÔk_±EÜ,-ò>¡Ø´O;$HÊ?k¾©y¢ûÍ–w­d*þìA¾i àÛO@±Ô¤èÂТ#_{çÄÆ>s¡)&9Ðím'F©³ï§Ý!@Bá¾ßð8^Э§2V‹kDgÆŒ ¹ãÛ9Êþxa8s d_y|k<, ?GóQèÎ#]/“|_™`M@_â;› v=Ž|I›å[`·Âd6kD\ô‚™Ó²ÎJÄÚêf¥}SñêÞ6¥þfãsÑ‚èì¦kÞ„\¤Ÿ#xÇk/6U[ÏÅùe :M8ϳmMÁA´ h—…€ £fóѪ°¬I9©t§ÊÔÊ‹Ö ¹¡Ü¸æô¯£‹ªœ¹ØÛ«5øQDÓCÈHzødFõdtŽ˜¡}ªFBV&_®Öþ>ñx³d"Ê#Šq0ò“%Õîê\(Û z•u¨œýxœ°9N«¡Ah·i…'ÒV½ãÈ/­Ø>ÞþYõÄžwÓ¤ŠºÈ—rr6ëâ Aª‘ÛYàG$þõ§„:ŠŸÝ•Ob/( ÇÞÜ Y’1'hPJs¥Û¸È‘D´%Ëß×Ðp|eL tçm¿âiâ u 7 àùQÃzÏ?n€Œ^D³sUlè«2Ÿ×|Œà´Œ6ò‘èI‰‘9‰·¦D’¦}&]1²âÀ5ÒŠnˆ1¥v{z3XÝÄŠ¾Ï™[ÕÌË0²¾X¨¯Ù+•\é°v:Åë–ùͧw&‹ß¢'Ž_Z.D\Mïä ˆwPA·ôN'êWYª5íÌOÞ@|ÓF{ç'´ I«ÝºµŸÂ;éÕ ôsô‘S¬‰¨‚}¾ ed¿ñc¥ØozÌ( W.'§îZ‚<(E½T«ÖéR¼pL ýYFʳIÛd¿¦(‹hNÿ^¨gV{ÜŸÍLÐ`÷;7LHÊ‹ÜÿVň(z·ž”{¢ÚÞøü¶¿cªªk²A2ü"è2VG¤Þ=ßl'‚N³K7`‘õl—L?íFÛ Jt„¬¡·¸žvÅNëlˆcMñº­)þÖ‘™Lé}㤊²ß3²Ì ËG÷ð„Ö©¦†6ª ýtkÀ„§ÚŒÕ‘Œ\±sµŠYs'¾'§^™hîpõ~rc.x;=Úù¶þ9LÇÖrQ‰]‡‹; =z«§áÌp?A*­Y0½,†Üv\‘ô5»Z}HªÂå«ïöÄ[ïÉ_k¼.Cábzù¾8{Ò{ð qS_úµ$ÈÂZ1 ì_¤¨ÞÄÑóQå·ÛðÎÿsL< ß??¸¢#¡øÀM׉·6T;žÁ÷– †Ƴ7’“ög»–ÆAþ"°ÝT¤¥]¦ü^‡´ÔšãÁ[Ãúùq ŠîG/šûÿ\ëyI–ŠÌó¤gñÍ£4ù8}Ç'º¤;2YaS·yf±ŠÚrd9ýxbÂeUe‹ÁÓ¢¾=­ìuá0ñ$ Çà”“‰Š—ay}ü¢šPa”òjëj`ŸÑi…;•Õjq‹8t¢ì@@‚Áœ@0Ž48äNv“k§÷‚­6øÜWMCňɾÙÅùx9ž~ÁõÈòÄ»®ên»¬¡Ü6–|=¨÷ùÒtÇtØ™SΗÁÓþ1\W%5¬~Ô·;Ä( áÛFû…!b´þsÓÆ2¡h“-ϯԞ³Ã˜BO¼fõ›Û•Õ¿¿³ D•;8©0Q—ÛD‡J‘°Œýý8ã endstream endobj 421 0 obj << /Type /ObjStm /N 100 /First 902 /Length 4022 /Filter /FlateDecode >> stream xÚí\IsÛȾëWà8©”Þ—ÔTªd{äÑØVIcËãò–`‰1EjHjlç×ç{¯›(ZÉä9¨Ñèåí[7a+QˆÂÈPèX¥ i$ž¶PFã© ž˜6˜×XjiÞ&¢¯UaÁÓθ-£eá‚Å»+<ÁÓ¡OÛ"¬G?jZ ):Ø,•4`“Ú`«èšò ÅŠ-ÄÒZPa:Q2jéˆ.+ %E`¢”õë”&ÔVƒ 8øSÖá`ʇŽWBmë %°[ð'4m…–(´" ,´&Ú"`»Ó…vØ1­½¢Å¶É´ØAŒ6n ÂÓH á‚ÇâƒDŠQh¼$*Ð,bЃO[ig =6Äh¸°Rš-ã}aéÁ‡ÂjCÛ#”ê ¨´Ã&ÈÂ:Ò@Ø °&èÂFEk )¡i-œ$ù@"N9Ð|á4i/„ÂY`˜qB—K3ˆM#@ ^œg^$þ "%MùÂ+ã· è÷ÇÂGâ<>+d<‘+uÀ‰ÐE4h¬0Eô‚F,:Ò¢R„ˆ4Û2¨- åKá#‚™H²#ȉŒ · C*MRÀ~©<Ïb¯Š†f±CKGÅ­“hѳ‰…À,p(²D Ó°*’MÂ6,,]B X³Á*"V‰Ò vXL–,ÝÁÖ¡"ìpŽ´F¶î…Q ÔCFzëÇ·ªçÅ’D±_TGïƒð ïb ¡Œ/G£[ÿ;/Û™ŒçÅ?Õ4íðúŠÏ]˜¥\ô¡B¸vîÇB‰ôPÕ›éäø žŠêÍó¢:¬¿Í‹Ëá÷‹ƒÓz«zŒõx>ƒßÚ¾Uí׳Éåô¸žqˆà¡×õÉpðtò­ø@ÅF[*Ø,¼ |¶Á à Lð ± ‰?ŒeGÈ=ŽŸxÿX~ƒøy( Z_c¶ù8´úï²à¯³`Ë‚û¯²`Ô5Œ¸ &s¼=Oñ'I"‰r$=¯PÀ붪§“éI=M°ÅG"à”#º—”²¥EøµôDØqšß±îàòӜἎ¿ â ¨~ÝßMÍgóùÅߪêëׯåéø²œLO«ãÉÅ÷Qýy^ý…uwr $Ì’Rº’º ô®ø}­”Þ|`4i#åƒm \·÷è²ãŸ”i’ê#áÅg”×ø ñ‘¶nE²u+óSå§ÎO“Ÿ6?]~úü ù™}Æex.ÃsžËð\†ç2<—á¹ Ïex.ÃóžÏð|†ç3<Ÿáù Ïgx>ÃóžÏðB†2¼á… /dx!à ^ÈðB¸!&,yTŸOª`JE8¯K¤§B,5…Œ ÊÉ1O|19œ0ÇT¯ßߥ(¥¦*SÀT‹RûRʰ¥ŒëÁi Åæ%™&†W¢tzM(½+C'IÜË•8MXNçJäÙàô¦Ä©cµ6åšpZ[8JƒÓ!Äë¸!u&«µ §„§Õ¥öz5Î5±)$ŵ(E„£¨ª'ÝÒ¶(q€*­rÕ&ÒXIu~ƒÓšÒÚÕVëìšp"D„ð§1¥ «­ÖŠ5áDI¤lëF›RÉÕAú5á”ÀZ«ÅÙ4ôXíšô ¯(éFcSûˆ¤l7ªOíTI÷3 N ã†p¦ˆ ­‚þZ_Á!¦ÚLDÈ(Q×xÓ>m8‰s4ýfXØ(K‰¼i(¡¤_µl‰úÁð8¯ÓžL¿ aãYËãÞ¸Òç5yœ!¤¾K»h=ŠäÈô{ÛŸkù#iÒMªÉÁ:¼¥–5M?r³®boë½è—qGšO#ÈÁÐ- /öFEZ•ôSfNÀS›–$¤Ý~w¥Fßç6#éΡ[‚ö˜¶K[j.J¹:·i$±N†Ù0M¿–óœÃ\(‚`Nx&!«§ Ý B;"É$ÁIûäÔ&™`_†žÖq+&ÕÒcà]1\ï/ ‰?,`½q¡±«o/»6â YíÊ4oüUPe’UÕÌ$RŸ[²=ǶwSK«lŠ ÔM‘"µÊék ž¥®ü0C7D†ß½R,/ŽPxˆ.d“ÙˆiXuZÁˆÚ^w•88ä–Áwç:®"­ïO]£"A5ž¡oðÁ ^°åˆ :¢!lZbÌÓ ™×iGØvøÄ!§ˆÒåù<Æ{3t¼dy†Oëð'…jÐãÏIÝ2zµ×ËÚèô;úãÑ%­ªFV…]^Vhd  òg–¸cô÷¨vÝ#|Ì/i5r0¼êe´^ÆÖÖõ‘”·þ/ý,ÑÑïg<Ëf¾ð4.YxÜ%gä-8ØR¡)ˆÚÄ-8¹ ¿±Ó4=Ï"Kbwl¾TÈ™ŒUŠ$ŒDBZ”üª.÷®0dBë¼KþÆ„¯ÃßLö:ö7œôÒlSêçõD¬ìz`kÊ8P)Ç,˜@iSR )½êÀ)S³¨)ó-)ã\J–k(/™XêÈ"2"ê¡ Ž£€è¸øà gy¢âßÚt­°¬˜˜LR6Ô@åE×S+…©1¬pJ"#Ò ÇK?Óx Jùlé‰~mˆf¦uÐE „Ù2šR±ÄÔŸ±ìo±Xß™¹¹e3Éñ‡T:îõ€°+þ,lþ ›»Z†BæÆ6/ Œ(°€ Κge’âê6GYþ’•å*SBLgx^Á±3›S£b+9–J&©M6ý”‹¨5‚Km‚ØÕ6‰-A»‰Ò»´f§M¸ºkÒˆ7ì‚mKæ LŸ2SæHvè5ò:’ZHÄÈP±)• ¼?cP|>f e i%·1>T¶#‹›”V®]©tyJ#¤3Ö[ó–åÝŒu÷ÐhÒ\ÒP¶œŽ\ž’ƲõèÅnçˆ&ÃþjX¼ŽîŠp^ä_V’j_.Z-ß5QíŸúV·”ÛmroØŽxÔ/æé+ozH£óø6åndƘV§~»Êð»é¬è@hz7Sx—6CìPư¥–Þ¯t|:>þkª¼`ÛB¤Õ\SÈȆ@WÎ[®Mœ'1ñ‚€¸Ù4mîùÒhÉ”ç2b)ÊÝÔºÐêŠðt¥ÑåÈǶŸôÄÏd³ýÒè’Ö#µi$i…÷5kÓ¼±D‡Á޵ÔÎ% ¥>·;¸t ú¼žO‡óÉ4]Šî Îé*wïðý«_þúìõS)0>œÎ “<åŸ@ O§)))Ð î옾KD­¾U=\ü\OÏðÜVEXhÉÝù`4<ÞŸŽêàæõù[ [ÕQÞ„X gƒ)]´þPmWϪçÕOÕNõ¢Ú­^U¯«½êÕ›j¿:¨«_«£ê}5¨>UÇÕñd4W'U]}®>«Óê¬V_ªQu^«IuQ]ÐÇ“üÍ+÷¦„®ú½šV³j^]V_«ïÕ¿ÿ’8Ý‚>+E÷kÒÛw´}ø~ç- îHªÕ’³š$'é߃Ä5I.Þ ¹§Ùý¼Rzï–dw<9?° É‘Eùyø„:¹œ^êx8®!Ù ZH·ž'',ÍYýG=®fÃoëülZ×Õüëþ2þFR®§“eA«ûúÅÏ{ï^<… Ÿ<ë±Qi&êý² ‘!–­[A‹){Õ²–]! ¼a5[æÆÜ‡›w?½}s´ n^ïö9œn΄[ÌFßd6Oˆ÷;°ô ,³B—9s÷ÒÓ›í½Ã£ÄYCh¹àL¹5qæl/g«8 ÷áèÍ?w_þÌÅÕ ©Øž]—ªÌ}R÷ŠY/_¼y÷Úï³=# ‰ø†gr±—ëë—êe'jý³‰[o¹(òÿkÌæÃìK5˜Ãr?MÇ_ê9‡ùÜOA®>ŽFƒ+Áîd‚±ióêó“Á쬪¿ŒªúÛñhpžã  Gm8<û~q†h7¬þµÇ—çŸêélx:nC䪔ãæÅèr†dôûåd^Ÿ|ñªÅKÎTôÖŽ§Ánχ‰§6ðÎFÄEOø½€Õ½ðö›Ý÷¿î‘Õø/ðÙh¤Rk1ßo4$Zp¼Ìν"ðË££wÿØ&vBO”rS‹õ°ãzÙÙ_fä^w{ïéÞëwÄHOtÒMtÒn=Œ˜[¹->úJ»}^v׺­$YQ¨{¥…W?ý¶½KiáàÕ­5³TúQy!ÞÁ%¶o­ûÞ"z6uòpQ#³$S9 é, Dß+­üòúàųmÈáaŸHeMçwœÿÓ׌Y"R.I„^‰(¥ú$â+‘Ë$Õ¸‹c ¥ æû²Xî7_¾Þ¹M'„ƒ÷½B‡FGv"énζRÑ<¬~0¢W,Ÿ.‘h‡ÓãQMÿ"p:¯Î‡ãËåzVß+šî¿}~°ý˜<ì¯gmã f]U_¸A÷tr| }ï_9WÒ|oعgȹ1‘s<º!G¯ÌÐú^™`çÅÞÞ/ïI ½îg’÷Ñ¿´„÷­£¬[]Ô‡óá褾Zß¡¤K‚û„ªí¦jïÆ*ïªÞ[¥ŸNëv•OgTÏf*îHp=EÞãKºËñ È8žL뛪;}¯l¶»ývïðÛNOá²éµ‡G›Î‹ˆ¶„X˜ËUoþ¼ì³_–‚øö],i )¨—dmîwþzvôzï诇õÑ“Ïõ÷óiŸ³J(þÙ"(ºÜô­Ì—’‚¸ý.ÃvüÔEßv½ÌHOjë|õIƒP×ÓÁ¬æ*¯Þ.±Íÿ«ÿ£åát6'´] ¼4/x{7<™ŸÍø3ᵇ“_ÇþI]È9ÿÏ_F­ endstream endobj 572 0 obj << /Producer (pdfTeX-1.40.15) /Creator (TeX) /CreationDate (D:20170225182454+01'00') /ModDate (D:20170225182454+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2015/dev/Debian) kpathsea version 6.2.1dev) >> endobj 544 0 obj << /Type /ObjStm /N 71 /First 608 /Length 2274 /Filter /FlateDecode >> stream xÚ­Y]oÛ¸}÷¯à£‹EñcH X,à¦M6ÛÄÍMÒ&Ýo¢¤Â:va+íößß3ÒЕ-­ÓyhDŠâ9sÎ )Ê *SÎx¥SN+såpG{år£È…¦÷AG*êL™Ì«Ü:ô1) „Qi£ÃÀdAiëµÒ¸w“-ð@Sp/7™²™c«retk•19sÀrÿ "Äfˆ{„†çFÄ䀆ՖãE›œÞ›¹Æ0,Ä2²CøÖÖ’Ðp>,A!,ÌŒhDeƒáFެÐÚ)72Õ,!™…S¬ŽiUN0R›¨LjgðUÄs¸¡žsÑ+X戂 xÎã>"@80Ï€ž‹eœ? ÒŠ2XN„ð9QDV‘á?„ŽõÜ ÖáÑà@A!˸§ˆ3G@†“x.ûÌÒ€,¯áy£¼a `y2@õ‘Áò¤B†Ò ˜`¼bÏç™àY€64rÈ‚ TÁ›0 ¨ ÞÅÁÏ?ö.¾}.ÔÞÁ|V öÎþ®ê.ßÔƒ½W“eÁ#jïjtññàÃOû'¯®àbýøëby½(?Wót[Têî—‹eµÿi²@N{Ç“Ô1è]–7Õ§%ÌÊ›g/æïgåõü¦Pº¾ñË/Oˆçð×ñåá+ij¾¯³ž€h3 <´Ò´ Èåîº|óáôêõÆ6㡸OÖ2ÈîàÇéh|qÕÐ÷å'ßJÏ»{:ûéÿŽŽ/~­Ùó.¹Ñ?Jîò¤¿=:â=?î+Û©QmÖÖ§oÅóØo'ç‡û£:ž‹‹ÞˆìÖRYßR³ÍˆvYG'goG¼ÅŸì§SºY;jEãŸN~öáõùè È/z·O¶§Ç´‹7nšažÏÁáxüÛGާ?9òµv-ߊ‡ž!9G£ã‹Ã:žžÕä:Õkóÿ\Mþ9jeÿêd|õÓEqõò¶øv¿èóÈuwÞlmgí¨¨Äéä®Xööç „¡§“EŸkà·åÍRýQwTsQM`¹ÆæjŒ\kÑ킯m& ¾¹:é;avys%»;IÜÞÉU0ƒpDጴ;GÌæ¸ƒ#¾–«ôÅBc²9ŒIÿÆJßJß¹æ»s`R£Çx’«ôƒŒ‡ð¿ÆÅ›Øä…¿QškSV¼³™ß™Ãê&§¶9ªòQs5N®gÖºÝ9Äw+¾['ñKÍZñÒRÜà †® \A¸¤vñ¥¶;Gì\¸š#>ñ´\ÎvæpRÿNòखäÁY#×Gsn[aÃI¼NâÏ×¶Žm0YÎ²Äøã¼YÞRªÍ–W™ïLa¢ÔbÚ^eïãOù&¢G?É“¸îÉ£{Z Õf/›®ä.ù»1ùÝC5-g<¿~÷(’·5¿zê_ ê^ƒcgš[VÓ‚¿ ›ášÍÁá{à‚sº(¾Ô?:´_Y2[¯f§ïÜþÙé[c\üû=¦u¬ta,ÚŠe×°úâ’¯ºKoÁJgÛJ‚Ü€ÊT:˜÷#Ñ’í"¥“€ì6 Ý’øÖqL‰Û,mÇ7Î5N\ù·Ùí×ptÎÊë¸nušYÄ%qem[f¶=Ɔ•±ÁniûÚMXùêó^˜ff“~å¤ßêd»ncûˆ¿ ®^²¢QVìK·A¶²Ûo«ljW¶ï)l¿2Ÿþ£®›©k†'÷ö¥áKýB5jˆ¦¼o‡:{ƒaºÏ$mƒF$:²ƒî—÷e• yè¯M.í07&âNŽG'O¨¨i ¢¥£o²1(uØhs’WC5FŽ+Cƒð(“62& @±iÄq‡6Ùð<uɠƸ4×sÇIj ‰4¹“ø Çxa']‡ ¨Ã#-ëñb‘…“2bY¾‡–I¢eAQ ±nìxɸ<Ö%dErþZV”KR,Ù,ÁæÜ‘N¶=†À¶y+­ñ–Ç:|Ž«R‹@MÖˆ@g¹ã¥›2æˆ;iÈém>†å¡.$Ù”1I”gE){\±r0É!tH­Ï:lå±± 9ý‰Ñ@,(HÄ‚B⃠›Öq¸±³ð—Ǻ„œ¤Ýû2ÿw`v³,¦Å5ÂN›ÐÚèÃ=›…Á΂lEÛ;¥#ï]-;e=L õÝ—bñ¥,¾"å~ý?}?¿¾´ŽÏ&_Û^§E|V,+d¨7õ\“E¹l†ª9ÿŪ¼FÕ¹-‹éÍ’_âÚûeÑ™Nè/¯xsìyWàã8—™TèdÒåd1ƒéK.¹©÷“Ù ¯ZQÒʯ8øµ¬>1–”ÖÉ)ÿ-ëåôwQ!§üzï”ðãqýðJ­|ÇÉÉä@ò¢ yl{DÔ{,j¿ì¢|ÊOi$‹™äôEò}L¾ÿu;€² ‘TÉosä©o‘?ÝI&É„|ì•úà×X Ëúÿ{;¿¥îO°Ìï͇õ÷oðô©Ü:äÖåH!Kgà»â„%ÞC¬>¬ýT¦(Ñ endstream endobj 573 0 obj << /Type /XRef /Index [0 574] /Size 574 /W [1 3 1] /Root 571 0 R /Info 572 0 R /ID [ ] /Length 1411 /Filter /FlateDecode >> stream xÚ%–YhVG†ç=þäWãã—Ä=1®Ñ˜D³»%.qKÜ5ÆÜˆ´*„R¯Zl¥H)Ý ¥•Âm§¡½*êE½Ð ½**H …Rlñ¢MlÿçÍÍÃ7ï7gfΜ÷›3!„ðŸB˜²OŠÈ÷…,„‚@±Yöi±™Õ£3·M!‘% d …›Î–ƒ<˜&’-6=hŒãÁPÜo˜ ãÄ~pô+lûÆÚ8)ìî·vGövZóFØ„'Á 8 N( |Çêë™-QÉ53¬0Xγ)H½íŽòó§b¥\¸lêI~–2Hã.}䥑(ˆD-¤r…+ >kIS®|h­‚õQ‰ªH• ¯Ÿw‚úHx7áØ„cžL3Þ}à.|¼T­pí¬Kמ¨ÐÄ×OX%á«„¯Ò"…tÎÏÚu¶è2ö€]KX*Õ+|yÃ]Ö‚Õ #?º¹†‘]~x(5(ÜqbØðPjT¸wÅ |•š@+hQxpÑ l–:@›Â£§ÖÚ¾€÷ ¯¥N…ÇWÝ¥ `½´Ya´Úš –S%mx-Mø´ÉÙ^Ðà zá»ÁN©ðØY<™0aê“Ê?·†ÿR?Ø'UŒ·†ÿÒ!0 Ík¶†ÓQpXªiµv„µø3z;ñZ:&Õ͆ÿÒ €ÿÒ)©i—C¬ë¥aiK©=”uç•€LÚ{ÓM‘“‰Ê@^:¶É‰R0¤¡g¬£óL¢‰`‚ôì;N”ƒ)`’tñ–5:LÒK®îúJ0ÌÞ¸k̓ÎsÀee[ÛúÁ>eå/XÛeÓV[;Ž€à°²ª³Nœ'•Õ¶»9ÈäþF§9©E4¤¬±-(ÿs•Oo3e=§Ý´ÃèqXÌ+;øž8,â°X¼\ ï±6`®8AÙù¯­a®ˆ›"nŠ“”]ÚçD˜Âð$b³X©ìåלðUÄ*‘¯ÙµÈ꣟Àfq>à—k6‹ nŠ8,.\"‡[Äa±ঈÃ"‡È/5®8,®˜+b®ˆ‘"–Šþ_nMsÅ€}"–Š­çD¬g(»ºÀ¾÷îâ¦Ø 0MÄHq+À/EN©Ø °OÜ 0HÄ4±àˆ_bÑoÿê]Û¯ìþeG”›1öQú•kô1”;0âè rçž8:¤Ü«µŽ+÷ûßŽŽ¨db¥££*©;çè˜JžsõÄã*ù쎣*yø£“*ù§ÙÑ òß;:¥ü[Ï;RþÎŽN+?ÚïðUh>¨¾Ýø*´4_SÖƒF°¸t›A ðEnhmÀ¿_g:Aè›ÿ[Á6åÿì *Õõð?ùaF endstream endobj startxref 393638 %%EOF numdiff-5.9.0/TODO0000644000175000017500000000001513054341114013161 0ustar paologpaolog* Add a GUI? numdiff-5.9.0/xalloc.h0000644000175000017500000001721213054341114014133 0ustar paologpaolog/* xalloc.h -- malloc with out-of-memory checking Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2003, 2004, 2006, 2007 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef XALLOC_H_ # define XALLOC_H_ # include # ifdef __cplusplus extern "C" { # endif # ifndef __attribute__ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__ # define __attribute__(x) # endif # endif # ifndef ATTRIBUTE_NORETURN # define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) # endif /* This function is always triggered when memory is exhausted. It must be defined by the application, either explicitly or by using gnulib's xalloc-die module. This is the function to call when one wants the program to die because of a memory allocation failure. */ extern void xalloc_die (void) ATTRIBUTE_NORETURN; void *xmalloc (size_t s); void *xzalloc (size_t s); void *xcalloc (size_t n, size_t s); void *xrealloc (void *p, size_t s); void *x2realloc (void *p, size_t *pn); void *xmemdup (void const *p, size_t s); char *xstrdup (char const *str); /* Return 1 if an array of N objects, each of size S, cannot exist due to size arithmetic overflow. S must be positive and N must be nonnegative. This is a macro, not an inline function, so that it works correctly even when SIZE_MAX < N. By gnulib convention, SIZE_MAX represents overflow in size calculations, so the conservative dividend to use here is SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value. However, malloc (SIZE_MAX) fails on all known hosts where sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for exactly-SIZE_MAX allocations on such hosts; this avoids a test and branch when S is known to be 1. */ # define xalloc_oversized(n, s) \ ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n)) /* In the following macros, T must be an elementary or structure/union or typedef'ed type, or a pointer to such a type. To apply one of the following macros to a function pointer or array type, you need to typedef it first and use the typedef name. */ /* Allocate an object of type T dynamically, with error checking. */ /* extern t *XMALLOC (typename t); */ # define XMALLOC(t) ((t *) xmalloc (sizeof (t))) /* Allocate memory for N elements of type T, with error checking. */ /* extern t *XNMALLOC (size_t n, typename t); */ # define XNMALLOC(n, t) \ ((t *) (sizeof (t) == 1 ? xmalloc (n) : xnmalloc (n, sizeof (t)))) /* Allocate an object of type T dynamically, with error checking, and zero it. */ /* extern t *XZALLOC (typename t); */ # define XZALLOC(t) ((t *) xzalloc (sizeof (t))) /* Allocate memory for N elements of type T, with error checking, and zero it. */ /* extern t *XCALLOC (size_t n, typename t); */ # define XCALLOC(n, t) \ ((t *) (sizeof (t) == 1 ? xzalloc (n) : xcalloc (n, sizeof (t)))) # if HAVE_INLINE # define static_inline static inline # else void *xnmalloc (size_t n, size_t s); void *xnrealloc (void *p, size_t n, size_t s); void *x2nrealloc (void *p, size_t *pn, size_t s); char *xcharalloc (size_t n); # endif # ifdef static_inline /* Allocate an array of N objects, each with S bytes of memory, dynamically, with error checking. S must be nonzero. */ static_inline void * xnmalloc (size_t n, size_t s) { if (xalloc_oversized (n, s)) xalloc_die (); return xmalloc (n * s); } /* Change the size of an allocated block of memory P to an array of N objects each of S bytes, with error checking. S must be nonzero. */ static_inline void * xnrealloc (void *p, size_t n, size_t s) { if (xalloc_oversized (n, s)) xalloc_die (); return xrealloc (p, n * s); } /* If P is null, allocate a block of at least *PN such objects; otherwise, reallocate P so that it contains more than *PN objects each of S bytes. *PN must be nonzero unless P is null, and S must be nonzero. Set *PN to the new number of objects, and return the pointer to the new block. *PN is never set to zero, and the returned pointer is never null. Repeated reallocations are guaranteed to make progress, either by allocating an initial block with a nonzero size, or by allocating a larger block. In the following implementation, nonzero sizes are increased by a factor of approximately 1.5 so that repeated reallocations have O(N) overall cost rather than O(N**2) cost, but the specification for this function does not guarantee that rate. Here is an example of use: int *p = NULL; size_t used = 0; size_t allocated = 0; void append_int (int value) { if (used == allocated) p = x2nrealloc (p, &allocated, sizeof *p); p[used++] = value; } This causes x2nrealloc to allocate a block of some nonzero size the first time it is called. To have finer-grained control over the initial size, set *PN to a nonzero value before calling this function with P == NULL. For example: int *p = NULL; size_t used = 0; size_t allocated = 0; size_t allocated1 = 1000; void append_int (int value) { if (used == allocated) { p = x2nrealloc (p, &allocated1, sizeof *p); allocated = allocated1; } p[used++] = value; } */ static_inline void * x2nrealloc (void *p, size_t *pn, size_t s) { size_t n = *pn; if (! p) { if (! n) { /* The approximate size to use for initial small allocation requests, when the invoking code specifies an old size of zero. 64 bytes is the largest "small" request for the GNU C library malloc. */ enum { DEFAULT_MXFAST = 64 }; n = DEFAULT_MXFAST / s; n += !n; } } else { /* Set N = ceil (1.5 * N) so that progress is made if N == 1. Check for overflow, so that N * S stays in size_t range. The check is slightly conservative, but an exact check isn't worth the trouble. */ if ((size_t) -1 / 3 * 2 / s <= n) xalloc_die (); n += (n + 1) / 2; } *pn = n; return xrealloc (p, n * s); } /* Return a pointer to a new buffer of N bytes. This is like xmalloc, except it returns char *. */ static_inline char * xcharalloc (size_t n) { return XNMALLOC (n, char); } # endif # ifdef __cplusplus } /* C++ does not allow conversions from void * to other pointer types without a cast. Use templates to work around the problem when possible. */ template inline T * xrealloc (T *p, size_t s) { return (T *) xrealloc ((void *) p, s); } template inline T * xnrealloc (T *p, size_t n, size_t s) { return (T *) xnrealloc ((void *) p, n, s); } template inline T * x2realloc (T *p, size_t *pn) { return (T *) x2realloc ((void *) p, pn); } template inline T * x2nrealloc (T *p, size_t *pn, size_t s) { return (T *) x2nrealloc ((void *) p, pn, s); } template inline T * xmemdup (T const *p, size_t s) { return (T *) xmemdup ((void const *) p, s); } # endif #endif /* !XALLOC_H_ */ numdiff-5.9.0/Makefile.in0000644000175000017500000003265313054341114014553 0ustar paologpaolog# !/bin/sh # Numdiff makefile # Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. # # @configure_input@ PACKAGE=numdiff PACKAGETWO=ndselect VERSION=5.9.0 SHELL=/bin/sh .SUFFIXES: .SUFFIXES: .c .o prefix =@prefix@ exec_prefix =@exec_prefix@ bindir =@bindir@ docdir =@docdir@ localedir =@localedir@ infodir =@infodir@ mandir =@mandir@ srcdir =@srcdir@ VPATH =@srcdir@ BINDIR=$(bindir) DOCDIR=$(docdir)/$(PACKAGE) INFODIR=$(infodir) LOCALEDIR=$(localedir) MANDIR=$(mandir)/man1 CC=@CC@ @SET_MAKE@ #MAKE=make MKDIR=$(srcdir)/shtool install -d DIST_MKDIR=$(srcdir)/shtool mkdir -f -m 777 INSTALL=$(srcdir)/shtool install -c MOVE=$(srcdir)/shtool move -p INSTALL_PROGRAM=$(INSTALL) INSTALL_DATA=$(INSTALL) -m 644 FIND=@FIND@ INSTINFO=@INSTINFO@ LS=ls CP=cp RM=rm -f RMDIR=rmdir RD=rm -f -R CAT=cat GZIP=gzip -f TAR=tar MSGFMT=msgfmt -c MSGMERGE=msgmerge XGETTEXT=xgettext -C -D$(srcdir) -k_ -kN_ --msgid-bugs-address=ivprimi@libero.it TEXI2HTML=makeinfo --html --no-split TEXI2INFO=makeinfo TEXI2PDF=texi2pdf TEXI2TXT=makeinfo --plaintext HELP2MAN=help2man -s 1 -m "User Commands" # flags for the preprocessor: CPPFLAGS =-DPACKAGE="\"$(PACKAGE)\"" -DPACKAGE2="\"$(PACKAGETWO)\"" -DLOCALEDIR="\"$(LOCALEDIR)\"" -I$(srcdir) -I. @CPPFLAGS@ # flags for the C compiler: CFLAGS =@CFLAGS@ # flags for the linker: LDFLAGS =@LDFLAGS@ # -L and -l options: LIBS =@LIBS@ @LIB_CLOCK_GETTIME@ OBJECTS= ./analyze.o ./arith.o ./bitvector.o ./cmpbuf.o ./cmpfns.o ./error.o ./exitfail.o ./flags.o ./getopt.o ./getopt1.o ./inout.o ./io.o ./linesplit.o ./main.o ./ndselect.o ./numutil.o ./options.o ./setmode.o ./side.o ./thrlist.o ./util.o ./xalloc-die.o ./xmalloc.o @LIBOBJS@ OBJECTSONE=./analyze.o ./arith.o ./bitvector.o ./cmpbuf.o ./cmpfns.o ./error.o ./exitfail.o ./flags.o ./getopt.o ./getopt1.o ./inout.o ./io.o ./linesplit.o ./main.o ./numutil.o ./options.o ./setmode.o ./side.o ./thrlist.o ./util.o ./xalloc-die.o ./xmalloc.o @LIBOBJS@ SOURCESONE=$(srcdir)/analyze.c $(srcdir)/arith.c $(srcdir)/bitvector.c $(srcdir)/cmpbuf.c $(srcdir)/cmpfns.c $(srcdir)/error.c $(srcdir)/errors.c $(srcdir)/exitfail.c $(srcdir)/flags.c $(srcdir)/getopt.c $(srcdir)/getopt1.c $(srcdir)/inout.c $(srcdir)/io.c $(srcdir)/linesplit.c $(srcdir)/main.c $(srcdir)/new.c $(srcdir)/number.c $(srcdir)/numutil.c $(srcdir)/options.c $(srcdir)/read_line.c $(srcdir)/setmode.c $(srcdir)/side.c $(srcdir)/thrlist.c $(srcdir)/util.c $(srcdir)/xalloc-die.c $(srcdir)/xmalloc.c OBJECTSTWO=./bitvector.o ./getopt.o ./getopt1.o ./linesplit.o ./ndselect.o SOURCESTWO=$(srcdir)/bitvector.c $(srcdir)/getopt.c $(srcdir)/getopt1.c $(srcdir)/linesplit.c $(srcdir)/ndselect.c $(srcdir)/read_line.c DOCS=$(srcdir)/AUTHORS $(srcdir)/BUGS $(srcdir)/COPYING $(srcdir)/ChangeLog $(srcdir)/INSTALL $(srcdir)/NEWS $(srcdir)/README $(srcdir)/TODO TEXISRC=$(srcdir)/docs/numdiff.txi FDLTEXI=$(srcdir)/docs/fdl.texi HTMLFILE=$(srcdir)/docs/numdiff.html INFOFILE=$(srcdir)/docs/numdiff.info MANFILE=$(srcdir)/docs/numdiff.1 MANFILETWO=$(srcdir)/docs/ndselect.1 PDFFILE=$(srcdir)/docs/numdiff.pdf TXTFILE=$(srcdir)/docs/numdiff.txt # l10n files PACKAGE_POT=$(srcdir)/po/$(PACKAGE)/$(PACKAGE).pot PACKAGETWO_POT=$(srcdir)/po/$(PACKAGETWO)/$(PACKAGETWO).pot PACKAGE_IT=$(srcdir)/po/$(PACKAGE)/it PACKAGETWO_IT=$(srcdir)/po/$(PACKAGETWO)/it IT_LOC_DIR="$(DESTDIR)$(LOCALEDIR)/it/LC_MESSAGES" GARBAGE=./numdiff.aux ./numdiff.cp ./numdiff.cps ./numdiff.fn ./numdiff.ky ./numdiff.log ./numdiff.pg ./numdiff.toc ./numdiff.tp ./numdiff.vr ./config.log ./config.status ./config.h.in.save ./config.h # Rules to build the executable programs all: $(PACKAGE) $(PACKAGETWO) $(PACKAGE): $(OBJECTS) $(CC) $(OBJECTSONE) -o $@ $(LDFLAGS) $(LIBS) $(PACKAGETWO): $(OBJECTS) $(CC) $(OBJECTSTWO) -o $@ $(LDFLAGS) $(LIBS) # Rules to build the documentation. The documentation # must be built in $(srcdir)/docs ! man: $(MANFILE) $(MANFILETWO) $(MANFILE): $(HELP2MAN) -n "compare similar files with numeric fields" -p $(PACKAGE) $(PACKAGE) > $(MANFILE) $(MANFILETWO): $(HELP2MAN) -n "select lines and fields for numdiff" -p $(PACKAGE) $(PACKAGETWO) > $(MANFILETWO) info: $(INFOFILE).gz $(INFOFILE).gz: $(INFOFILE) $(CAT) $(INFOFILE) | $(GZIP) > $(INFOFILE).gz $(INFOFILE): $(TEXISRC) $(TEXI2INFO) $(TEXISRC) -o $(INFOFILE) html: $(HTMLFILE) $(HTMLFILE): $(TEXISRC) $(TEXI2HTML) $(TEXISRC) -o $(HTMLFILE) pdf: $(PDFFILE) $(PDFFILE): $(TEXISRC) $(TEXI2PDF) $(TEXISRC) -o $(PDFFILE) txt: $(TXTFILE) $(TXTFILE): $(TEXISRC) $(TEXI2TXT) $(TEXISRC) -o $(TXTFILE) # Rules to create PO template files. They should be used # only by the maintainer of the package. pot: $(PACKAGE_POT) $(PACKAGETWO_POT) $(PACKAGE_POT): $(SOURCESONE) @echo 'This command is intended for maintainers to use; it' @echo 'requires special tools to work.' $(XGETTEXT) --package-name=$(PACKAGE) \ --package-version=$(VERSION) \ -o $(PACKAGE_POT) $(SOURCESONE) *.h $(PACKAGETWO_POT): $(SOURCESTWO) @echo 'This command is intended for maintainers to use; it' @echo 'requires special tools to work.' $(XGETTEXT) --package-name=$(PACKAGETWO) \ --package-version=$(VERSION) \ -o $(PACKAGETWO_POT) $(SOURCESTWO) *.h po: $(PACKAGE_IT).po $(PACKAGETWO_IT).po $(PACKAGE_IT).po: $(PACKAGE_POT) @echo 'This command is intended for maintainers to use; it' @echo 'requires special tools to work.' if $(SHELL) -c "$(LS) $(PACKAGE_IT).po" \ >/dev/null 2>&1; then \ $(MSGMERGE) $(PACKAGE_IT).po $(PACKAGE_POT) -o $(PACKAGE_IT).po.new; \ $(MOVE) $(PACKAGE_IT).po.new $(PACKAGE_IT).po; \ else $(CP) $(PACKAGE_POT) $(PACKAGE_IT).po; fi $(PACKAGETWO_IT).po: $(PACKAGETWO_POT) @echo 'This command is intended for maintainers to use; it' @echo 'requires special tools to work.' if $(SHELL) -c "$(LS) $(PACKAGETWO_IT).po" \ >/dev/null 2>&1; then \ $(MSGMERGE) $(PACKAGETWO_IT).po $(PACKAGETWO_POT) -o $(PACKAGETWO_IT).po.new; \ $(MOVE) $(PACKAGETWO_IT).po.new $(PACKAGETWO_IT).po; \ else $(CP) $(PACKAGETWO_POT) $(PACKAGETWO_IT).po; fi # Rules to build the l10n files. They # must be built in $(srcdir)/po/numdiff (for numdiff) and # in $(srcdir)/po/ndselect (for ndselect). mo: $(PACKAGE_IT).mo $(PACKAGETWO_IT).mo $(PACKAGE_IT).mo: $(PACKAGE_IT).po $(MSGFMT) $(PACKAGE_IT).po -o $(PACKAGE_IT).mo $(PACKAGETWO_IT).mo: $(PACKAGETWO_IT).po $(MSGFMT) $(PACKAGETWO_IT).po -o $(PACKAGETWO_IT).mo # Rules needed by the installation process. installdirs: all $(MKDIR) "$(DESTDIR)$(BINDIR)" $(MKDIR) "$(DESTDIR)$(DOCDIR)" $(MKDIR) "$(DESTDIR)$(INFODIR)" $(MKDIR) "$(DESTDIR)$(MANDIR)" $(MKDIR) $(IT_LOC_DIR) install: installdirs html info pdf txt $(INSTALL_PROGRAM) $(PACKAGE) $(PACKAGETWO) "$(DESTDIR)$(BINDIR)" $(INSTALL_DATA) $(DOCS) "$(DESTDIR)$(DOCDIR)" $(INSTALL_DATA) $(MANFILE) "$(DESTDIR)$(MANDIR)" $(INSTALL_DATA) $(MANFILETWO) "$(DESTDIR)$(MANDIR)" $(INSTALL_DATA) $(HTMLFILE) "$(DESTDIR)$(DOCDIR)" $(INSTALL_DATA) $(PDFFILE) "$(DESTDIR)$(DOCDIR)" $(INSTALL_DATA) $(TXTFILE) "$(DESTDIR)$(DOCDIR)" $(POST_INSTALL) $(INSTALL_DATA) $(INFOFILE) "$(DESTDIR)$(INFODIR)" $(INSTALL_DATA) $(INFOFILE).gz "$(DESTDIR)$(INFODIR)" if $(SHELL) -c "$(INSTINFO) --version" \ >/dev/null 2>&1; then \ $(INSTINFO) --dir-file="$(DESTDIR)$(INFODIR)/dir" "$(DESTDIR)$(INFODIR)/numdiff.info"; \ else true; fi install-nls: install $(INSTALL_DATA) $(PACKAGE_IT).mo $(IT_LOC_DIR)/$(PACKAGE).mo $(INSTALL_DATA) $(PACKAGETWO_IT).mo $(IT_LOC_DIR)/$(PACKAGETWO).mo # Rules needed to removed the installed stuff uninstall: $(RM) "$(DESTDIR)$(BINDIR)/$(PACKAGE)" $(RM) "$(DESTDIR)$(BINDIR)/$(PACKAGETWO)" $(RM) "$(DESTDIR)$(DOCDIR)"/* $(RMDIR) "$(DESTDIR)$(DOCDIR)" $(INSTINFO) --delete "$(DESTDIR)$(INFODIR)/numdiff.info" "$(DESTDIR)$(INFODIR)/dir" $(RM) "$(DESTDIR)$(INFODIR)/numdiff.info.gz" $(RM) "$(DESTDIR)$(INFODIR)/numdiff.info" $(RM) "$(DESTDIR)$(MANDIR)/$(PACKAGE).1" $(RM) "$(DESTDIR)$(MANDIR)/$(PACKAGETWO).1" uninstall-nls: uninstall $(FIND) "$(DESTDIR)$(LOCALEDIR)" -name '$(PACKAGE).mo' -exec $(RM) \{\} \; $(FIND) "$(DESTDIR)$(LOCALEDIR)" -name '$(PACKAGETWO).mo' -exec $(RM) \{\} \; # Cleaning rules clean: $(RM) $(OBJECTS) $(RM) $(PACKAGE) $(RM) $(PACKAGETWO) distclean: clean $(RM) $(GARBAGE) maintainer-clean: distclean @echo 'This command is intended for maintainers to use; it' @echo 'deletes files that may need special tools to rebuild.' $(RM) $(HTMLFILE) $(RM) $(INFOFILE) $(RM) $(INFOFILE).gz $(RM) $(MANFILE) $(RM) $(MANFILETWO) $(RM) $(PDFFILE) $(RM) $(TXTFILE) $(RM) $(PACKAGE_POT) $(RM) $(PACKAGETWO_POT) $(RM) $(PACKAGE_IT).mo $(RM) $(PACKAGETWO_IT).mo # To make a distribution tarball createdirs: $(DIST_MKDIR) $(srcdir)/$(PACKAGE)-$(VERSION) $(DIST_MKDIR) $(srcdir)/$(PACKAGE)-$(VERSION)/RCS $(DIST_MKDIR) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(DIST_MKDIR) $(srcdir)/$(PACKAGE)-$(VERSION)/m4 $(DIST_MKDIR) $(srcdir)/$(PACKAGE)-$(VERSION)/po $(DIST_MKDIR) $(srcdir)/$(PACKAGE)-$(VERSION)/po/$(PACKAGE) $(DIST_MKDIR) $(srcdir)/$(PACKAGE)-$(VERSION)/po/$(PACKAGETWO) copy: createdirs $(CP) $(DOCS) $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/Makefile.in $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/aclocal.m4 $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/config.h.in $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/configure.ac $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/configure $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(TEXISRC) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(FDLTEXI) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(HTMLFILE) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(INFOFILE) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(INFOFILE).gz $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(MANFILE) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(MANFILETWO) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(PDFFILE) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(TXTFILE) $(srcdir)/$(PACKAGE)-$(VERSION)/docs $(CP) $(srcdir)/analyze.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/arith.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/bitvector.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/cmpbuf.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/cmpfns.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/error.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/errors.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/exitfail.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/flags.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/getopt.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/getopt1.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/inout.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/io.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/linesplit.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/main.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/ndselect.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/new.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/number.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/numutil.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/options.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/read_line.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/setmode.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/side.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/thrlist.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/util.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/xalloc-die.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/xmalloc.c $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/bitvector.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/cmpbuf.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/error.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/exitfail.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/getopt.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/getopt_int.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/gettext.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/linesplit.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/ndselect.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/number.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/numdiff.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/setmode.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/system.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/unlocked-io.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/xalloc.h $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/shtool $(srcdir)/$(PACKAGE)-$(VERSION) $(CP) $(srcdir)/m4/setmode.m4 $(srcdir)/$(PACKAGE)-$(VERSION)/m4 $(CP) $(srcdir)/m4/st_mtim.m4 $(srcdir)/$(PACKAGE)-$(VERSION)/m4 $(CP) $(PACKAGE_POT) $(srcdir)/$(PACKAGE)-$(VERSION)/po/$(PACKAGE) $(CP) $(PACKAGE_IT).po $(srcdir)/$(PACKAGE)-$(VERSION)/po/$(PACKAGE) $(CP) $(PACKAGE_IT).mo $(srcdir)/$(PACKAGE)-$(VERSION)/po/$(PACKAGE) $(CP) $(PACKAGETWO_POT) $(srcdir)/$(PACKAGE)-$(VERSION)/po/$(PACKAGETWO) $(CP) $(PACKAGETWO_IT).po $(srcdir)/$(PACKAGE)-$(VERSION)/po/$(PACKAGETWO) $(CP) $(PACKAGETWO_IT).mo $(srcdir)/$(PACKAGE)-$(VERSION)/po/$(PACKAGETWO) dist: copy $(TAR) cvf $(srcdir)/$(PACKAGE)-$(VERSION).tar $(srcdir)/$(PACKAGE)-$(VERSION) $(GZIP) $(srcdir)/$(PACKAGE)-$(VERSION).tar $(RD) $(srcdir)/$(PACKAGE)-$(VERSION) # To make a backup tarball tarball: copy $(CP) $(srcdir)/RCS/* $(srcdir)/$(PACKAGE)-$(VERSION)/RCS $(TAR) cvf $(srcdir)/$(PACKAGE)-$(VERSION).tar $(srcdir)/$(PACKAGE)-$(VERSION) $(GZIP) $(srcdir)/$(PACKAGE)-$(VERSION).tar $(RD) $(srcdir)/$(PACKAGE)-$(VERSION) numdiff-5.9.0/inout.c0000444000175000017500000006115113054341114014001 0ustar paologpaolog/* File I/O for GNU DIFF. Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU DIFF. GNU DIFF is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU DIFF is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* This file, coming from the source code of GNU DIFF, has been modified by Ivano Primi so that it could be merged into the source code of Numdiff. Numdiff is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. Numdiff 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. */ #include "numdiff.h" #include "linesplit.h" #include #include #include /* Lines are put into equivalence classes of lines that match in lines_differ. Each equivalence class is represented by one of these structures, but only while the classes are being computed. Afterward, each class is represented by a number. */ struct equivclass { lin next; /* Next item in this bucket. */ hash_value hash; /* Hash of lines in this class. */ char const *line; /* A line that fits this class. */ size_t length; /* That line's length, not counting its newline. */ short file; /* That line's file, 0 --> filevec[0].name, 1 --> filevec[1].name */ }; /* Hash-table: array of buckets, each being a chain of equivalence classes. buckets[-1] is reserved for incomplete lines. */ static lin *buckets; /* Number of buckets in the hash table array, not counting buckets[-1]. */ static size_t nbuckets; /* Array in which the equivalence classes are allocated. The bucket-chains go through the elements in this array. The number of an equivalence class is its index in this array. */ static struct equivclass *equivs; /* Index of first free element in the array `equivs'. */ static lin equivs_index; /* Number of elements allocated in the array `equivs'. */ static lin equivs_alloc; /* Read a block of data into a file buffer, checking for EOF and error. */ static void file_block_read (struct file_data *current, size_t size) { if (size && ! current->eof) { size_t s = block_read (current->desc, FILE_BUFFER (current) + current->buffered, size); if (s == SIZE_MAX) pfatal_with_name (current->name); current->buffered += s; current->eof = s < size; } } /* Check for binary files and compare them for exact identity. */ /* Return 1 if BUF contains a non text character. SIZE is the number of characters in BUF. */ #define binary_file_p(buf, size) (memchr (buf, 0, size) != 0) /* Get ready to read the current file. Return nonzero if SKIP_TEST is zero, and if it appears to be a binary file. */ static bool sip (struct file_data *current, bool skip_test) { /* If we have a nonexistent file at this stage, treat it as empty. */ if (current->desc < 0) { /* Leave room for a sentinel. */ current->bufsize = sizeof (word); current->buffer = xmalloc (current->bufsize); } else { current->bufsize = buffer_lcm (sizeof (word), STAT_BLOCKSIZE (current->stat), PTRDIFF_MAX - 2 * sizeof (word)); current->buffer = xmalloc (current->bufsize); if (! skip_test) { /* Check first part of file to see if it's a binary file. */ bool was_binary = set_binary_mode (current->desc, 1); off_t buffered; file_block_read (current, current->bufsize); buffered = current->buffered; if (! was_binary) { /* Revert to text mode and seek back to the beginning to reread the file. Use relative seek, since file descriptors like stdin might not start at offset zero. */ if (lseek (current->desc, - buffered, SEEK_CUR) == -1) pfatal_with_name (current->name); set_binary_mode (current->desc, 0); current->buffered = 0; current->eof = 0; } return binary_file_p (current->buffer, buffered); } } current->buffered = 0; current->eof = 0; return 0; } /* Slurp the rest of the current file completely into memory. */ static void slurp (struct file_data *current) { size_t cc; if (current->desc < 0) { /* The file is nonexistent. */ return; } if (S_ISREG (current->stat.st_mode)) { /* It's a regular file; slurp in the rest all at once. */ /* Get the size out of the stat block. Allocate just enough room for appended newline plus word sentinel, plus word-alignment since we want the buffer word-aligned. */ size_t file_size = current->stat.st_size; cc = file_size + 2 * sizeof (word) - file_size % sizeof (word); if (file_size != current->stat.st_size || cc < file_size || PTRDIFF_MAX <= cc) xalloc_die (); if (current->bufsize < cc) { current->bufsize = cc; current->buffer = xrealloc (current->buffer, cc); } /* Try to read at least 1 more byte than the size indicates, to detect whether the file is growing. This is a nicety for users who run 'diff' on files while they are changing. */ if (current->buffered <= file_size) { file_block_read (current, file_size + 1 - current->buffered); if (current->buffered <= file_size) return; } } /* It's not a regular file, or it's a growing regular file; read it, growing the buffer as needed. */ file_block_read (current, current->bufsize - current->buffered); if (current->buffered) { while (current->buffered == current->bufsize) { if (PTRDIFF_MAX / 2 - sizeof (word) < current->bufsize) xalloc_die (); current->bufsize *= 2; current->buffer = xrealloc (current->buffer, current->bufsize); file_block_read (current, current->bufsize - current->buffered); } /* Allocate just enough room for appended newline plus word sentinel, plus word-alignment. */ cc = current->buffered + 2 * sizeof (word); current->bufsize = cc - cc % sizeof (word); current->buffer = xrealloc (current->buffer, current->bufsize); } } /* Split the file into lines, simultaneously computing the equivalence class for each line. */ static void find_and_hash_each_line (struct file_data *current, const char** ifs, int index, const argslist *argl) { hash_value h; unsigned char const *p = (unsigned char const *) current->prefix_end; unsigned char *eof, c; lin i, *bucket; size_t length; /* Cache often-used quantities in local variables to help the compiler. */ int ignore_case = (getBitAtPosition (&argl->optmask, _SI_MASK) == BIT_ON); const struct numfmt* pnf = (index) ? &argl->nf2 : &argl->nf1; const unsigned char* ghostmask = (index) ? argl->ghostmask2 : argl->ghostmask1; const unsigned char* pblurmask = (index) ? argl->pblurmask2 : argl->pblurmask1; const unsigned char* tblurmask = (index) ? argl->tblurmask2 : argl->tblurmask1; char const **linbuf = current->linbuf; lin alloc_lines = current->alloc_lines; lin line = 0; lin linbuf_base = current->linbuf_base; lin *cureqs = xmalloc (alloc_lines * sizeof *cureqs); struct equivclass *eqs = equivs; lin eqs_index = equivs_index; lin eqs_alloc = equivs_alloc; char const *suffix_begin = current->suffix_begin; char const *bufend = FILE_BUFFER (current) + current->buffered; const unsigned long fieldno_upper_limit = FIELDMASK_SIZE*8; while ((char const *) p < suffix_begin) { char const *ip = (char const *) p; unsigned long fieldno; hash_value htmp; /* Hash this line until we find a newline. */ /* First we have to initialize `p' so that it points */ /* to the first character of the first field */ h = 0; p = (unsigned char const*)string_spn ((const char*)p, ifs, '\n'); for (fieldno = 0; fieldno < fieldno_upper_limit && *p != '\n'; fieldno++) { eof = (unsigned char*) string_cspn ((const char*) p, ifs, '\n'); /* We have to mark the end of the field before calling hcxnum() or acxnum(). But before doing this, we save the original character placed just after the field. */ c = *eof; *eof = '\0'; if ( (ghostmask[fieldno >> 3] & 0x80 >> (fieldno & 0x7)) ) { /* If the field lies in the ranges specified by the option -X, then it must be ignored. */ p = (unsigned char const *) eof; } else if ( (tblurmask[fieldno >> 3] & 0x80 >> (fieldno & 0x7)) ) { /* If the field lies in the ranges specified by the option -Z, then it must be always blurred, even if it is not numeric. */ h = HASH (h, NEWLINE); p = (unsigned char const *) eof; } else if ( (pblurmask[fieldno >> 3] & 0x80 >> (fieldno & 0x7)) ) { if ((unsigned char*) acxnum ((char*)p, pnf) < eof) { /* If the field is not numeric, then it must be hashed byte by byte, even if it lies in the ranges specified by the option -z. */ if ((ignore_case)) for(; (unsigned char*)p < eof; h = HASH (h, TOLOWER (*p)), p++); else for(; (unsigned char*)p < eof; h = HASH (h, *p), p++); } else { /* If the field is numeric AND lies in the ranges specified by -z, then this field has to be hashed as a special symbol. */ h = HASH (h, NEWLINE); p = (unsigned char const *) eof; } } else { /* If the field does not lie in the ranges specified by -z, -X and -Z, then this field must be always hashed byte by byte (particular numerical formats are converted before to the standard one). */ htmp = h; if ((unsigned char*) hcxnum ((char*)p, pnf, &htmp) < eof) { if ((ignore_case)) for(; (unsigned char*)p < eof; h = HASH (h, TOLOWER (*p)), p++); else for(; (unsigned char*)p < eof; h = HASH (h, *p), p++); } else { h = htmp; p = (unsigned char const *) eof; } } /* Now `p' points to the end of the field */ *eof = c; p = (unsigned char const*)string_spn ((const char*)p, ifs, '\n'); /* And now to the beginning of the next field */ } if (fieldno >= fieldno_upper_limit) { fprintf (stderr, _("*** Fatal error occurred in function %s:\n%s"), __FUNCTION__, _("*** a very long line has been encountered which contains\n*** too many fields to be correctly handled\n")); exit (EXIT_TROUBLE); } p++; /* hashing_done:; */ bucket = &buckets[h % nbuckets]; length = (char const *) p - ip - 1; #ifdef _DEBUG_HASHING_ fprintf (stderr, "File: \"%s\"\nLine: \"%.*s\"\nHash: %u\n", current->name, length, ip, h); #endif /* _DEBUG_HASHING_ */ for (i = *bucket; ; i = eqs[i].next) if (!i) { /* Create a new equivalence class in this bucket. */ i = eqs_index++; if (i == eqs_alloc) { if (PTRDIFF_MAX / (2 * sizeof *eqs) <= eqs_alloc) xalloc_die (); eqs_alloc *= 2; eqs = xrealloc (eqs, eqs_alloc * sizeof *eqs); } eqs[i].next = *bucket; eqs[i].hash = h; eqs[i].line = ip; eqs[i].length = length; eqs[i].file = index; *bucket = i; break; } else if (eqs[i].hash == h) { char const *eqline = eqs[i].line; /* Reuse existing class if lines_differ reports the lines equal. */ if (eqs[i].length == length) { /* Reuse existing equivalence class if the lines are identical. This detects the common case of exact identity faster than lines_differ would. */ if (memcmp (eqline, ip, length) == 0) break; } if (! lines_differ (eqline, ip, eqs[i].file, index, argl) ) break; } /* Maybe increase the size of the line table. */ if (line == alloc_lines) { /* Double (alloc_lines - linbuf_base) by adding to alloc_lines. */ if (PTRDIFF_MAX / 3 <= alloc_lines || PTRDIFF_MAX / sizeof *cureqs <= 2 * alloc_lines - linbuf_base || PTRDIFF_MAX / sizeof *linbuf <= alloc_lines - linbuf_base) xalloc_die (); alloc_lines = 2 * alloc_lines - linbuf_base; cureqs = xrealloc (cureqs, alloc_lines * sizeof *cureqs); linbuf += linbuf_base; linbuf = xrealloc (linbuf, (alloc_lines - linbuf_base) * sizeof *linbuf); linbuf -= linbuf_base; } linbuf[line] = ip; cureqs[line] = i; ++line; } current->buffered_lines = line; for (i = 0; ; i++) { /* Record the line start for lines in the suffix that we care about. Record one more line start than lines, so that we can compute the length of any buffered line. */ if (line == alloc_lines) { /* Double (alloc_lines - linbuf_base) by adding to alloc_lines. */ if (PTRDIFF_MAX / 3 <= alloc_lines || PTRDIFF_MAX / sizeof *cureqs <= 2 * alloc_lines - linbuf_base || PTRDIFF_MAX / sizeof *linbuf <= alloc_lines - linbuf_base) xalloc_die (); alloc_lines = 2 * alloc_lines - linbuf_base; linbuf += linbuf_base; linbuf = xrealloc (linbuf, (alloc_lines - linbuf_base) * sizeof *linbuf); linbuf -= linbuf_base; } linbuf[line] = (char const *) p; if ((char const *) p == bufend) { /* If the last line is incomplete, don't count its appended newline. */ if ((current->missing_newline)) linbuf[line]--; break; } if ((suppress_common_lines)) break; line++; while (*p++ != '\n') continue; } /* Done with cache in local variables. */ current->linbuf = linbuf; current->valid_lines = line; current->alloc_lines = alloc_lines; current->equivs = cureqs; equivs = eqs; equivs_alloc = eqs_alloc; equivs_index = eqs_index; #ifdef _DEBUG_HASHING_ if (1) { size_t n; lin j; fprintf (stderr, "buckets[-1] = %ld\n", buckets[-1]); for (n = 0; n < nbuckets; n++) fprintf (stderr, "buckets[%zu] = %ld\n", n, buckets[n]); for (n = 0; n < equivs_alloc; n++) fprintf (stderr, "equivs[%zu] = {next = %d, hash = %lu, line = %s, length = %zu, file = %d}\n", n, equivs[n].next, equivs[n].hash, equivs[n].line, equivs[n].length, equivs[n].file); char const **linbuf = current->linbuf; lin alloc_lines = current->alloc_lines; fprintf (stderr, "current->linbuf_base = %ld, current->buffered_lines = %ld,\n current->valid_lines = %ld, current->alloc_lines = %ld\n", current->linbuf_base, current->buffered_lines, current->valid_lines, current->alloc_lines); for ( j = current->linbuf_base; j < current->alloc_lines; j++ ) fprintf (stderr, "current->linbuf[%ld] = %s\n", j, current->linbuf[j]); fprintf (stderr, " current->equivs = "); for ( j = 0; j < current->buffered_lines; j++ ) fprintf (stderr, "%ld ", current->equivs[j]); fputs ("\n", stderr); } #endif /* _DEBUG_HASHING_ */ } /* Prepare the text. Make sure the text end is initialized. Make sure text ends in a newline, but remember that we had to add one. */ static void prepare_text (struct file_data *current) { size_t buffered = current->buffered; char *p = FILE_BUFFER (current); if (buffered == 0 || p[buffered - 1] == '\n') current->missing_newline = 0; else { p[buffered++] = '\n'; current->missing_newline = 1; } if (!p) return; /* Don't use uninitialized storage when planting or using sentinels. */ memset (p + buffered, 0, sizeof (word)); current->buffered = buffered; } /* We have found N lines in a buffer of size S; guess the proportionate number of lines that will be found in a buffer of size T. However, do not guess a number of lines so large that the resulting line table might cause overflow in size calculations. */ static lin guess_lines (lin n, size_t s, size_t t) { size_t guessed_bytes_per_line = n < 10 ? 32 : s / (n - 1); lin guessed_lines = MAX (1, t / guessed_bytes_per_line); return MIN (guessed_lines, PTRDIFF_MAX / (2 * sizeof (char *) + 1) - 5) + 5; } /* Given a vector of two file_data objects, find the identical prefixes and suffixes of each object. */ static void find_identical_ends (struct file_data filevec[]) { word *w0, *w1; char *p0, *p1, *buffer0, *buffer1; char const *end0, *beg0; char const **linbuf0, **linbuf1; lin i, lines; size_t n0, n1; lin alloc_lines0, alloc_lines1; lin buffered_prefix, prefix_count, prefix_mask; lin middle_guess, suffix_guess; slurp (&filevec[0]); prepare_text (&filevec[0]); if (filevec[0].desc != filevec[1].desc) { slurp (&filevec[1]); prepare_text (&filevec[1]); } else { filevec[1].buffer = filevec[0].buffer; filevec[1].bufsize = filevec[0].bufsize; filevec[1].buffered = filevec[0].buffered; filevec[1].missing_newline = filevec[0].missing_newline; } /* Find identical prefix. */ w0 = filevec[0].buffer; w1 = filevec[1].buffer; p0 = buffer0 = (char *) w0; p1 = buffer1 = (char *) w1; n0 = filevec[0].buffered; n1 = filevec[1].buffered; if (p0 == p1) /* The buffers are the same; sentinels won't work. */ p0 = p1 += n1; else { /* Insert end sentinels, in this case characters that are guaranteed to make the equality test false, and thus terminate the loop. */ if (n0 < n1) p0[n0] = ~p1[n0]; else p1[n1] = ~p0[n1]; /* Loop until first mismatch, or to the sentinel characters. */ /* Compare a word at a time for speed. */ while (*w0 == *w1) w0++, w1++; /* Do the last few bytes of comparison a byte at a time. */ p0 = (char *) w0; p1 = (char *) w1; while (*p0 == *p1) p0++, p1++; /* Don't mistakenly count missing newline as part of prefix. */ if ((buffer0 + n0 - filevec[0].missing_newline < p0) != (buffer1 + n1 - filevec[1].missing_newline < p1)) p0--, p1--; } /* Now P0 and P1 point at the first nonmatching characters. */ /* Skip back to last line-beginning in the prefix */ while (p0 != buffer0 && p0[-1] != '\n') p0--, p1--; /* Record the prefix. */ filevec[0].prefix_end = p0; filevec[1].prefix_end = p1; /* Find identical suffix. */ /* P0 and P1 point beyond the last chars not yet compared. */ p0 = buffer0 + n0; p1 = buffer1 + n1; if (filevec[0].missing_newline == filevec[1].missing_newline) { end0 = p0; /* Addr of last char in file 0. */ /* Get value of P0 at which we should stop scanning backward: this is when either P0 or P1 points just past the last char of the identical prefix. */ beg0 = filevec[0].prefix_end + (n0 < n1 ? 0 : n0 - n1); /* Scan back until chars don't match or we reach that point. */ while (p0 != beg0) if (*--p0 != *--p1) { /* Point at the first char of the matching suffix. */ ++p0, ++p1; beg0 = p0; break; } /* Are we at a line-beginning in both files? If not, add the rest of this line to the main body. Discard one line, because shift_boundaries may need it. */ i = !((buffer0 == p0 || p0[-1] == '\n') && (buffer1 == p1 || p1[-1] == '\n')); while (i-- && p0 != end0) while (*p0++ != '\n') continue; p1 += p0 - beg0; } /* Record the suffix. */ filevec[0].suffix_begin = p0; filevec[1].suffix_begin = p1; /* Calculate number of lines of prefix to save. prefix_count == 0 means save the whole prefix; we need this for options that output the whole file. Otherwise, prefix_count == 1 and the prefix is not saved. */ if (suppress_common_lines && 0 < n0) { middle_guess = guess_lines (0, 0, p0 - filevec[0].prefix_end); suffix_guess = guess_lines (0, 0, buffer0 + n0 - p0); prefix_count = 1; alloc_lines0 = (prefix_count + middle_guess); } else { prefix_count = 0; alloc_lines0 = guess_lines (0, 0, n0); } prefix_mask = prefix_count - 1; lines = 0; linbuf0 = xmalloc (alloc_lines0 * sizeof *linbuf0); p0 = buffer0; /* If the prefix is needed, find the prefix lines. */ if (! (suppress_common_lines && filevec[0].prefix_end == p0 && filevec[1].prefix_end == p1)) { end0 = filevec[0].prefix_end; while (p0 != end0) { lin l = lines++ & prefix_mask; if (l == alloc_lines0) { if (PTRDIFF_MAX / (2 * sizeof *linbuf0) <= alloc_lines0) xalloc_die (); alloc_lines0 *= 2; linbuf0 = xrealloc (linbuf0, alloc_lines0 * sizeof *linbuf0); } linbuf0[l] = p0; while (*p0++ != '\n') continue; } } /* buffered_prefix = prefix_count && 0 < lines ? 0 : lines; */ buffered_prefix = (prefix_count) ? 0 : lines; /* Allocate line buffer 1. */ middle_guess = guess_lines (lines, p0 - buffer0, p1 - filevec[1].prefix_end); suffix_guess = guess_lines (lines, p0 - buffer0, buffer1 + n1 - p1); alloc_lines1 = buffered_prefix + middle_guess; if (alloc_lines1 < buffered_prefix || PTRDIFF_MAX / sizeof *linbuf1 <= alloc_lines1) xalloc_die (); linbuf1 = xmalloc (alloc_lines1 * sizeof *linbuf1); /* Initialize line buffer 1 from line buffer 0. */ for (i = 0; i < buffered_prefix; i++) linbuf1[i] = linbuf0[i] - buffer0 + buffer1; /* Record the line buffer, adjusted so that linbuf[0] points at the first differing line. */ filevec[0].linbuf = linbuf0 + buffered_prefix; filevec[1].linbuf = linbuf1 + buffered_prefix; filevec[0].linbuf_base = filevec[1].linbuf_base = - buffered_prefix; filevec[0].alloc_lines = alloc_lines0 - buffered_prefix; filevec[1].alloc_lines = alloc_lines1 - buffered_prefix; filevec[0].prefix_lines = filevec[1].prefix_lines = lines; } /* If 1 < k, then (2**k - prime_offset[k]) is the largest prime less than 2**k. This table is derived from Chris K. Caldwell's list . */ static unsigned char const prime_offset[] = { 0, 0, 1, 1, 3, 1, 3, 1, 5, 3, 3, 9, 3, 1, 3, 19, 15, 1, 5, 1, 3, 9, 3, 15, 3, 39, 5, 39, 57, 3, 35, 1, 5, 9, 41, 31, 5, 25, 45, 7, 87, 21, 11, 57, 17, 55, 21, 115, 59, 81, 27, 129, 47, 111, 33, 55, 5, 13, 27, 55, 93, 1, 57, 25 }; /* Verify that this host's size_t is not too wide for the above table. */ verify (enough_prime_offsets, sizeof (size_t) * CHAR_BIT <= sizeof prime_offset); extern char** def_ifs; /* Given a vector of two file_data objects, read the file associated with each one, and build the table of equivalence classes. Return nonzero if either file appears to be a binary file. */ bool read_files (struct file_data filevec[], const argslist* argl) { int i; bool appears_binary = sip (&filevec[0], 0); const char **ifs1, **ifs2; ifs1 = (!argl->ifs1) ? (const char**)def_ifs : (const char**)argl->ifs1; ifs2 = (!argl->ifs2) ? (const char**)def_ifs : (const char**)argl->ifs2; if (filevec[0].desc != filevec[1].desc) appears_binary |= sip (&filevec[1], appears_binary); /*# skip test if appears_binary is already !0 #*/ /* else */ /* { */ /* filevec[1].buffer = filevec[0].buffer; */ /* filevec[1].bufsize = filevec[0].bufsize; */ /* filevec[1].buffered = filevec[0].buffered; */ /* } */ if (appears_binary) return 1; find_identical_ends (filevec); equivs_alloc = filevec[0].alloc_lines + filevec[1].alloc_lines + 1; if (PTRDIFF_MAX / sizeof *equivs <= equivs_alloc) xalloc_die (); equivs = xmalloc (equivs_alloc * sizeof *equivs); /* Equivalence class 0 is permanently safe for lines that were not hashed. Real equivalence classes start at 1. */ equivs_index = 1; /* Allocate (one plus) a prime number of hash buckets. Use a prime number between 1/3 and 2/3 of the value of equiv_allocs, approximately. */ for (i = 9; (size_t) 1 << i < equivs_alloc / 3; i++) continue; nbuckets = ((size_t) 1 << i) - prime_offset[i]; if (PTRDIFF_MAX / sizeof *buckets <= nbuckets) xalloc_die (); buckets = zalloc ((nbuckets + 1) * sizeof *buckets); buckets++; find_and_hash_each_line (&filevec[0], ifs1, 0, argl); find_and_hash_each_line (&filevec[1], ifs2, 1, argl); filevec[0].equiv_max = filevec[1].equiv_max = equivs_index; free (equivs); free (buckets - 1); return 0; } numdiff-5.9.0/README0000644000175000017500000000301713054341114013356 0ustar paologpaolog Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. *********************************************************************************** Numdiff ~~~~~~~ This README file is distributed together with the source code of Numdiff, a program which compares putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. Numdiff is Copyright (C) of Ivano Primi , which is also its author. Numdiff (also written numdiff) is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. Numdiff 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 in a file called COPYING. If not, see . Detailed instructions on how to install Numdiff can be found in the file INSTALL. The full documentation of Numdiff can be found in the directory ./docs . numdiff-5.9.0/ndselect.h0000444000175000017500000000572513054341114014456 0ustar paologpaolog/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef _NDSELECT_H_ #define _NDSELECT_H_ #include"config.h" #include"bitvector.h" /* Error codes */ #define OPEN_ERROR -1 #define READ_ERROR -2 #define CLOSE_ERROR -3 typedef struct { /* Mask of the options */ bitvector optmask; /* Begin, end, step */ unsigned long begin_line, end_line, step; /* First field, last field, increment */ unsigned long first_field, last_field, increment; /* Internal fields separators */ char **ifs; /* Output separator */ char *osep; /* File to read from */ const char *file; } Argslist ; /* A structure of this type is used to store the options */ /* set by the user */ enum { ___H_MASK = 0, /* -h option, used to recall help */ ___B_MASK = 1, /* -b option, used to set the start line */ ___E_MASK = 2, /* -e option, used to set the end line */ ___S_MASK = 3, /* -s option, used to explicitly set the step */ ___SF_MASK= 4, /* -F option, used to set the first field to display */ ___SL_MASK= 5, /* -L option, used to set the last field to display */ ___SI_MASK= 6, /* -I option, used to explicitly set the increment */ ___SS_MASK= 7, /* -S option, used to explicitly set IFS */ ___SD_MASK= 8, /* -D option, used to explicitly set IFS */ ___SO_MASK= 9, /* -O option, used to set the output separator */ ___X_MASK =10, /* -x option, to omit empty lines */ ___L_MASK =11, /* -l option, to redirect the standard error on a file */ ___O_MASK =12, /* -o option, to redirect the standard output on a file */ ___V_MASK =13, /* -v option, used to show version number, Copyright and No-Warranty */ MAX_NDSELECT_OPTIONS = 20 }; /* I18N and L10N support */ #ifdef ENABLE_NLS #include #define _(String) gettext (String) #define gettext_noop(String) String #define N_(String) gettext_noop (String) #else #define _(String) (String) #define N_(String) String #define textdomain(Domain) #define bindtextdomain(Package, Directory) #endif #ifndef PACKAGE2 #define PACKAGE2 "ndselect" #endif #ifndef LOCALEDIR #define LOCALEDIR "/usr/local/share/locale/" #endif #endif /* _NDSELECT_H_ */ numdiff-5.9.0/bitvector.c0000444000175000017500000001543213054341114014645 0ustar paologpaolog/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include "bitvector.h" static void exitOnOutOfMemory (int lineNo, size_t nBytes) { fprintf (stderr, "*** Out of memory occurred at line %d of file %s\n" "*** while trying to allocate space for %zu bytes,\n" "*** exit now!\n", lineNo, __FILE__, nBytes); exit (EXIT_FAILURE); } static size_t arrangeMemoryFor (bitvector* bv, size_t newSize) { if (!bv || newSize == 0) return 0; else { /* BV is not the null pointer and NEWSIZE is greater than zero. */ if (!(bv->ptr)) { bv->ptr = (byte_t*) calloc (newSize, sizeof(byte_t)); bv->sz = (!bv->ptr ? 0 : newSize); } else { /* BV->PTR is not the null pointer */ if (newSize != bv->sz) { byte_t* tmp = (byte_t*) realloc (bv->ptr, newSize * sizeof(byte_t)); if (!tmp) { return 0; } else { bv->ptr = tmp; if (newSize > bv->sz) { memset (bv->ptr + bv->sz * sizeof(byte_t), 0, (newSize-bv->sz) * sizeof(byte_t)); } bv->sz = newSize; } } } return bv->sz; } } static int getBitFrom (byte_t* barray, size_t pos) { return ( (barray[pos / NBITS_PER_BYTE] & (0x1 << pos % NBITS_PER_BYTE)) == 0 ? BIT_OFF : BIT_ON ); } static void setBit (byte_t* barray, size_t pos, int value) { if (value == BIT_OFF) barray[pos / NBITS_PER_BYTE] &= ~(0x1 << pos % NBITS_PER_BYTE); else barray[pos / NBITS_PER_BYTE] |= (0x1 << pos % NBITS_PER_BYTE); } static void flipBit (byte_t* barray, size_t pos) { barray[pos / NBITS_PER_BYTE] ^= (0x1 << pos % NBITS_PER_BYTE); } bitvector newBitVector (size_t requestedSize) { bitvector bv = {(byte_t*)0, 0}; size_t sizeInBytes = (requestedSize > 0 ? (requestedSize - 1) / NBITS_PER_BYTE + 1 : 0); if ( arrangeMemoryFor (&bv, sizeInBytes) < sizeInBytes ) { exitOnOutOfMemory (__LINE__, sizeInBytes * sizeof(byte_t)); } return bv; } size_t getBitVectorSize (const bitvector* bv) { return ((bv) ? NBITS_PER_BYTE * bv->sz : (size_t)(-1)); } int getBitAtPosition (const bitvector* bv, size_t pos) { if (!bv || !bv->ptr || pos >= bv->sz * NBITS_PER_BYTE) { return BIT_ERR; } else { return getBitFrom (bv->ptr, pos); } } int* getBitsInRange (const bitvector* bv, size_t startpos, size_t endpos) { if (!bv || !bv->ptr) { return (int*)0; } else { const size_t szInBits = bv->sz * NBITS_PER_BYTE; if (endpos <= startpos || startpos >= szInBits) { return (int*)0; } else { /* 0 <= STARTPOS < ENDPOS, and STARTPOS < SZINBITS */ const size_t difference = endpos - startpos; size_t idx; int* barray = (int*) malloc (difference*sizeof(int)); if (!barray) { exitOnOutOfMemory (__LINE__, difference*sizeof(int)); } for (idx = startpos; idx < szInBits; idx++) { barray[idx-startpos] = getBitFrom (bv->ptr, idx); } for (idx -= startpos; idx < difference; barray[idx++] = BIT_ERR); return barray; } } } void setBitAtPosition (bitvector* bv, size_t pos, int value) { if ((bv)) { if (pos >= bv->sz * NBITS_PER_BYTE) { if ( arrangeMemoryFor (bv, pos / NBITS_PER_BYTE + 1) == 0 ) { exitOnOutOfMemory (__LINE__, (pos / NBITS_PER_BYTE + 1)*sizeof(byte_t)); } } /* Whenever we arrive here POS < BV->SZ * NBITS_PER_BYTE */ setBit (bv->ptr, pos, value); } } void setBitsInRange (bitvector* bv, size_t startpos, size_t endpos, const int* varray) { if ((bv)) { if (endpos > startpos && endpos > bv->sz * NBITS_PER_BYTE) { if ( arrangeMemoryFor (bv, (endpos-1) / NBITS_PER_BYTE + 1) == 0 ) { exitOnOutOfMemory (__LINE__, ((endpos-1) / NBITS_PER_BYTE + 1)*sizeof(byte_t)); } } size_t pos; for (pos = startpos; pos < endpos; pos++) { setBit (bv->ptr, pos, varray[pos-startpos]); } } } void setBitsInRangeToValue (bitvector* bv, size_t startpos, size_t endpos, int value) { if ((bv)) { size_t effectiveEnd = endpos; if (endpos > startpos && endpos > bv->sz * NBITS_PER_BYTE) { if ( arrangeMemoryFor (bv, (endpos-1) / NBITS_PER_BYTE + 1) == 0 ) { exitOnOutOfMemory (__LINE__, ((endpos-1) / NBITS_PER_BYTE + 1)*sizeof(byte_t)); } if (value == 0) effectiveEnd = bv->sz * NBITS_PER_BYTE; } size_t pos; for (pos = startpos; pos < effectiveEnd; pos++) { setBit (bv->ptr, pos, value); } } } size_t flipBitsInRange (bitvector* bv, size_t startpos, size_t endpos) { if ((bv) && (bv->ptr) && bv->sz > 0) { size_t pos, afterlast = bv->sz * NBITS_PER_BYTE; size_t lbd = startpos / NBITS_PER_BYTE + 1; size_t ubd; if (endpos < afterlast) { afterlast = endpos; } ubd = afterlast / NBITS_PER_BYTE; if (lbd <= ubd) { for (pos = lbd; pos < ubd; pos++) { bv->ptr[pos] = ~(bv->ptr[pos]); } lbd *= NBITS_PER_BYTE; for (pos = startpos; pos < lbd; pos++) { flipBit (bv->ptr, pos); } ubd *= NBITS_PER_BYTE; for (pos = ubd; pos < afterlast; pos++) { flipBit (bv->ptr, pos); } } else { for (pos = startpos; pos < afterlast; pos++) { flipBit (bv->ptr, pos); } } return (startpos < afterlast ? afterlast - startpos : 0); } else { return 0; } } size_t printBitVectorOn (const bitvector* bv, FILE* fp) { if ((bv) && (bv->ptr) && bv->sz > 0) { const size_t szInBits = bv->sz * NBITS_PER_BYTE; size_t pos, idx = 0; int bitValue, rv = ' '; do { pos = szInBits - (++idx); bitValue = getBitFrom (bv->ptr, pos); rv = putc ((bitValue == BIT_OFF ? '0' : '1'), fp); } while (idx < szInBits && rv != EOF); return (rv != EOF ? szInBits : idx-1); } else { return 0; } } void emptyBitVector (bitvector* bv) { if ((bv) && (bv->ptr)) { free ((void*)bv->ptr); bv->ptr = (byte_t*)0; bv->sz = 0; } } numdiff-5.9.0/setmode.c0000644000175000017500000000322413054341114014302 0ustar paologpaolog/* Set a file descriptor's mode to binary or to text. Copyright (C) 2001 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Written by Paul Eggert */ #if HAVE_CONFIG_H # include #endif #if HAVE_STDBOOL_H # include #else typedef enum {false = 0, true = 1} bool; #endif #if HAVE_SETMODE_DOS # include # if HAVE_FCNTL_H # include # endif # if HAVE_UNISTD_H # include # endif #endif #include "setmode.h" #undef set_binary_mode /* Set the binary mode of FD to MODE, returning its previous mode. MODE is 1 for binary and 0 for text. If setting the mode might cause problems, ignore the request and return MODE. Always return 1 on POSIX platforms, which do not distinguish between text and binary. */ bool set_binary_mode (int fd, bool mode) { #if HAVE_SETMODE_DOS if (isatty (fd)) return mode; return setmode (fd, mode ? O_BINARY : O_TEXT) != O_TEXT; #else return 1; #endif } numdiff-5.9.0/exitfail.h0000644000175000017500000000150313054341114014452 0ustar paologpaolog/* Failure exit status Copyright (C) 2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ extern int volatile exit_failure; numdiff-5.9.0/getopt.h0000644000175000017500000001745313054341114014162 0ustar paologpaolog/* Declarations for getopt. Copyright (C) 1989-1994,1996-1999,2001,2003,2004 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _GETOPT_H #ifndef __need_getopt # define _GETOPT_H 1 #endif /* Standalone applications should #define __GETOPT_PREFIX to an identifier that prefixes the external functions and variables defined in this header. When this happens, include the headers that might declare getopt so that they will not cause confusion if included after this file. Then systematically rename identifiers so that they do not collide with the system functions and variables. Renaming avoids problems with some compilers and linkers. */ #if defined __GETOPT_PREFIX && !defined __need_getopt # include # include # if HAVE_UNISTD_H # include # endif # undef __need_getopt # undef getopt # undef getopt_long # undef getopt_long_only # undef optarg # undef opterr # undef optind # undef optopt # define __GETOPT_CONCAT(x, y) x ## y # define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y) # define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y) # define getopt __GETOPT_ID (getopt) # define getopt_long __GETOPT_ID (getopt_long) # define getopt_long_only __GETOPT_ID (getopt_long_only) # define optarg __GETOPT_ID (optarg) # define opterr __GETOPT_ID (opterr) # define optind __GETOPT_ID (optind) # define optopt __GETOPT_ID (optopt) #endif /* Standalone applications get correct prototypes for getopt_long and getopt_long_only; they declare "char **argv". libc uses prototypes with "char *const *argv" that are incorrect because getopt_long and getopt_long_only can permute argv; this is required for backward compatibility (e.g., for LSB 2.0.1). This used to be `#if defined __GETOPT_PREFIX && !defined __need_getopt', but it caused redefinition warnings if both unistd.h and getopt.h were included, since unistd.h includes getopt.h having previously defined __need_getopt. The only place where __getopt_argv_const is used is in definitions of getopt_long and getopt_long_only below, but these are visible only if __need_getopt is not defined, so it is quite safe to rewrite the conditional as follows: */ #if !defined __need_getopt # if defined __GETOPT_PREFIX # define __getopt_argv_const /* empty */ # else # define __getopt_argv_const const # endif #endif /* If __GNU_LIBRARY__ is not already defined, either we are being used standalone, or this is the first header included in the source file. If we are being used with glibc, we need to include , but that does not exist if we are standalone. So: if __GNU_LIBRARY__ is not defined, include , which will pull in for us if it's from glibc. (Why ctype.h? It's guaranteed to exist and it doesn't flood the namespace with stuff the way some other headers do.) */ #if !defined __GNU_LIBRARY__ # include #endif #ifndef __THROW # ifndef __GNUC_PREREQ # define __GNUC_PREREQ(maj, min) (0) # endif # if defined __cplusplus && __GNUC_PREREQ (2,8) # define __THROW throw () # else # define __THROW # endif #endif #ifdef __cplusplus extern "C" { #endif /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; #ifndef __need_getopt /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { const char *name; /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ # define no_argument 0 # define required_argument 1 # define optional_argument 2 #endif /* need getopt */ /* Get definitions and prototypes for functions to process the arguments in ARGV (ARGC of them, minus the program name) for options given in OPTS. Return the option character from OPTS just read. Return -1 when there are no more options. For unrecognized options, or options missing arguments, `optopt' is set to the option letter, and '?' is returned. The OPTS string is a list of characters which are recognized option letters, optionally followed by colons, specifying that that letter takes an argument, to be placed in `optarg'. If a letter in OPTS is followed by two colons, its argument is optional. This behavior is specific to the GNU `getopt'. The argument `--' causes premature termination of argument scanning, explicitly telling `getopt' that there are no more options. If OPTS begins with `--', then non-option arguments are treated as arguments to the option '\0'. This behavior is specific to the GNU `getopt'. */ extern int getopt (int ___argc, char *const *___argv, const char *__shortopts) __THROW; #ifndef __need_getopt extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind) __THROW; extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind) __THROW; #endif #ifdef __cplusplus } #endif /* Make sure we later can get all the definitions and declarations. */ #undef __need_getopt #endif /* getopt.h */ numdiff-5.9.0/cmpfns.c0000444000175000017500000005025113054341114014130 0ustar paologpaolog/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include"numdiff.h" #include"linesplit.h" /* See io.c */ extern char* read_line (FILE* pf, int* errcode); extern void print_lines (const char* line1, const char* line2, unsigned long lineno1, unsigned long lineno2, int delimiter_only); extern void print_fields (const char* field1, const char* field2, size_t l1, size_t l2, unsigned long lineno1, unsigned long lineno2, unsigned long fieldno1, unsigned long fieldno2); extern void print_errors (Real abserr, Real relerr, int human_readable_format); extern void print_separator (void); static void field2cx (const char* field, size_t length, char** tail, int iscale, const struct numfmt* pnf, Complex* pz) { char* ptr = (char*) field; char ch; ch = ptr[length]; ptr[length] = '\0'; str2C (ptr, tail, iscale, pnf, pz); ptr[length] = ch; } /* Be careful ! strNcmp() and strNcasecmp() are only used when n <= strlen (s) == strlen (t). */ static int strNcmp (const char* s, const char* t, size_t n) { const char *p, *q; for (p = s, q = t; p < s + n && *p == *q; p++, q++); return p < s + n; } static int strNcasecmp (const char* s, const char* t, size_t n) { const char *p, *q; for (p = s, q = t; p < s + n && TOLOWER(*p) == TOLOWER(*q); p++, q++); return p < s + n; } static int cmp_fields (const char* field1, const char* field2, unsigned long fieldno1, unsigned long fieldno2, size_t l1, size_t l2, const argslist* argl, statlist* statres, Real* abserr, Real* relerr, int* Labserr_exceeded, int* Rabserr_exceeded) { char *tail1, *tail2; Complex z1, z2; field2cx (field1, l1, &tail1, argl->iscale, &argl->nf1, &z1); field2cx (field2, l2, &tail2, argl->iscale, &argl->nf2, &z2); #ifdef __DEBUG__ fprintf (stderr, "l1 = %zu, tail1 - field1 = %zu\n", l1, tail1 - field1); fprintf (stderr, "l2 = %zu, tail2 - field2 = %zu\n", l2, tail2 - field2); #endif if (tail1 - field1 == l1 && tail2 - field2 == l2) { /* This second test manages the options -P and -N . If neither of them has been set, then the condition is always TRUE. */ if ( (smart_cmp (&z2, &z1, argl->flag)) ) { int exit_code; /* Numeric comparison */ Complex w; Real x1, x2; int iscale = argl->iscale; initC (&w); initR (&x1); initR (&x2); Csub (z1, z2, &w, iscale); Cabs (w, abserr, iscale); #ifdef _MPA_DEBUG fputs ("*** MPA Debug output\n", stderr); fputs ("1st number= ( ", stderr); debug_printno (z1.re, 20); fputs (", ", stderr); debug_printno (z1.im, 20); fputs (" )\n", stderr); fputs ("2nd number= ( ", stderr); debug_printno (z2.re, 20); fputs (", ", stderr); debug_printno (z2.im, 20); fputs (" )\n", stderr); fputs ("abs. err= ", stderr); debug_printno (*abserr, 20); fputs ("\n*** *** ***\n", stderr); #endif if (argl->relerr_formula == CLASSIC_FORMULA) { Cabs (z1, &x1, iscale); Cabs (z2, &x2, iscale); if ( cmp (x1, x2) > 0 ) copyR (&x1, x2); if ( (is0(x1)) ) (is0(*abserr)) ? copyR(relerr, Zero) : copyR(relerr, Inf); else divide (*abserr, x1, relerr, iscale); } else if (argl->relerr_formula == WR_TO_FIRST_FILE) { Cabs (z1, &x1, iscale); if ( (is0(x1)) ) (is0(*abserr)) ? copyR(relerr, Zero) : copyR(relerr, Inf); else divide (*abserr, x1, relerr, iscale); } else if (argl->relerr_formula == WR_TO_SECOND_FILE) { Cabs (z2, &x2, iscale); if ( (is0(x2)) ) (is0(*abserr)) ? copyR(relerr, Zero) : copyR(relerr, Inf); else divide (*abserr, x2, relerr, iscale); } delR (&x2); delR (&x1); delC (&w); delC (&z2); delC (&z1); if (getBitAtPosition (&argl->optmask, _2_MASK) == BIT_OFF) exit_code = thrlist_cmp (*relerr, argl->maxrelerr, fieldno1, fieldno2) > 0 && thrlist_cmp (*abserr, argl->maxabserr, fieldno1, fieldno2) > 0 ? 2:0; else exit_code = thrlist_cmp (*relerr, argl->maxrelerr, fieldno1, fieldno2) > 0 || thrlist_cmp (*abserr, argl->maxabserr, fieldno1, fieldno2) > 0 ? 2:0; if (getBitAtPosition (&argl->optmask, _SS_MASK) == BIT_ON) { statres->Nentries++; initR (&x1); initR (&x2); /* To compute the 1-norm of all errors */ add (*abserr, statres->N1abserr, &x1, iscale); copyR (&statres->N1abserr, x1); /* To compute the 2-norm of all errors */ square (*abserr, &x1, iscale); add (x1, statres->N2abserr, &x2, iscale); copyR (&statres->N2abserr, x2); if ((exit_code)) { int test; statres->Ndisperr++; /* To compute the 1-norm of the displayed errors */ add (*abserr, statres->N1disperr, &x1, iscale); copyR (&statres->N1disperr, x1); /* To compute the 2-norm of the displayed errors */ square (*abserr, &x1, iscale); add (x1, statres->N2disperr, &x2, iscale); copyR (&statres->N2disperr, x2); if ((test = cmp (*abserr, statres->Labserr)) > 0) { copyR (&statres->Labserr, *abserr); copyR (&statres->Crelerr, *relerr); *Labserr_exceeded = 1; } else if (test == 0 && cmp (*relerr, statres->Crelerr) > 0) { copyR (&statres->Crelerr, *relerr); *Labserr_exceeded = 1; } if ((test = cmp (*relerr, statres->Lrelerr)) > 0) { copyR (&statres->Lrelerr, *relerr); copyR (&statres->Cabserr, *abserr); *Rabserr_exceeded = 1; } else if (test == 0 && cmp (*abserr, statres->Cabserr) > 0) { copyR (&statres->Cabserr, *abserr); *Rabserr_exceeded = 1; } } delR (&x2); delR (&x1); } return exit_code; } else return 0; } else { delC (&z2); delC (&z1); /* Byte by byte comparison */ if (getBitAtPosition (&argl->optmask, _SI_MASK) == BIT_ON) return (l1 != l2 || strNcasecmp (field1, field2, l1) != 0 ? 1 : 0); else return (l1 != l2 || strNcmp (field1, field2, l1) != 0 ? 1 : 0); } } static int cmp_lines (const char* line1, const char* line2, unsigned long lineno1, unsigned long lineno2, const char** ifs1, const char** ifs2, const argslist* argl, statlist* statres) { const unsigned long fieldno_upper_limit = 8*FIELDMASK_SIZE; int output_mode = argl->output_mode; if (!line1 && !line2) return 0; else if (!line1) { if (output_mode >= OUTMODE_NORMAL) print_lines (line1, line2, lineno1, lineno2, 0); else if (output_mode == OUTMODE_RAW) printf ("*:%lu\n", lineno2); return 1; } else if (!line2) { if (output_mode >= OUTMODE_NORMAL) print_lines (line1, line2, lineno1, lineno2, 0); else if (output_mode == OUTMODE_RAW) printf ("%lu:*\n", lineno1); return 1; } else { const char *field1, *field2; char *end_field1, *end_field2; size_t l1, l2; unsigned long fieldno1, fieldno2; Real abserr, relerr; int Labserr_exceeded, Rabserr_exceeded; int rv, lines_differ = 0, _1sttime = 1; initR (&abserr); initR (&relerr); field1 = string_spn (line1, ifs1, '\0'); field2 = string_spn (line2, ifs2, '\0'); fieldno1 = fieldno2 = 0; while (*field1 != '\0' && *field2 != '\0') { /* Ignore the fields selected through the option -X 1: */ while ( *field1 != '\0' && fieldno1 < fieldno_upper_limit && (argl->ghostmask1[fieldno1 >> 3] & 0x80 >> (fieldno1 & 0x7)) ) { end_field1 = string_cspn (field1, ifs1, '\0'); field1 = string_spn (end_field1, ifs1, '\0'); fieldno1++; } if ( fieldno1 >= fieldno_upper_limit ) { printf (_("@ Line %lu in file \"%s\"\n contains too many fields to be properly processed!\n"), lineno1, argl->file1); exit (EXIT_TROUBLE); } /* Ignore the fields selected through the option -X 2: */ while ( *field2 != '\0' && fieldno2 < fieldno_upper_limit && (argl->ghostmask2[fieldno2 >> 3] & 0x80 >> (fieldno2 & 0x7)) ) { end_field2 = string_cspn (field2, ifs2, '\0'); field2 = string_spn (end_field2, ifs2, '\0'); fieldno2++; } if ( fieldno2 >= fieldno_upper_limit ) { printf (_("@ Line %lu in file \"%s\"\n contains too many fields to be properly processed!\n"), lineno2, argl->file2); exit (EXIT_TROUBLE); } if (*field1 != '\0' && *field2 != '\0') { end_field1 = string_cspn (field1, ifs1, '\0'); end_field2 = string_cspn (field2, ifs2, '\0'); l1 = end_field1 - field1; l2 = end_field2 - field2; Labserr_exceeded = Rabserr_exceeded = 0; rv = cmp_fields (field1, field2, fieldno1, fieldno2, l1, l2, argl, statres, &abserr, &relerr, &Labserr_exceeded, &Rabserr_exceeded); if ((Labserr_exceeded)) { statres->Labserr_location.lineno1 = lineno1; statres->Labserr_location.fieldno1 = fieldno1; statres->Labserr_location.lineno2 = lineno2; statres->Labserr_location.fieldno2 = fieldno2; } if ((Rabserr_exceeded)) { statres->Rabserr_location.lineno1 = lineno1; statres->Rabserr_location.fieldno1 = fieldno1; statres->Rabserr_location.lineno2 = lineno2; statres->Rabserr_location.fieldno2 = fieldno2; } if ( rv >= 1 ) { if ( (output_mode > OUTMODE_QUIET) && !(rv == 1 && getBitAtPosition (&argl->optmask, _SE_MASK) == BIT_ON) && !(rv == 2 && getBitAtPosition (&argl->optmask, _SU_MASK) == BIT_ON) ) { if ((_1sttime)) { print_lines (line1, line2, lineno1, lineno2, output_mode != OUTMODE_VERBOSE && output_mode != OUTMODE_COINCISE); _1sttime = 0; } print_fields (field1, field2, l1, l2, lineno1, lineno2, fieldno1, fieldno2); if ( rv == 2 ) print_errors (abserr, relerr, 1); else print_separator (); } else if ( (output_mode == OUTMODE_RAW) && !(rv == 1 && getBitAtPosition (&argl->optmask, _SE_MASK) == BIT_ON) && !(rv == 2 && getBitAtPosition (&argl->optmask, _SU_MASK) == BIT_ON) ) { printf ("%lu:%lu:%lu:%lu:", lineno1, lineno2, fieldno1+1, fieldno2+1); if (rv == 1) { fputs ("*:*:", stdout); } else /* rv == 2 */ { print_errors (abserr, relerr, 0); } printf ("%.*s ==> ", l1, field1); printf ("%.*s\n", l2, field2); } lines_differ = 1; } field1 = string_spn (end_field1, ifs1, '\0'); fieldno1++; field2 = string_spn (end_field2, ifs2, '\0'); fieldno2++; } } /* end while (*field1 != '\0' && *field2 != '\0') */ delR (&abserr); delR (&relerr); /* Ignore the fields selected through the option -X 1: */ while ( *field1 != '\0' && fieldno1 < fieldno_upper_limit && (argl->ghostmask1[fieldno1 >> 3] & 0x80 >> (fieldno1 & 0x7)) ) { end_field1 = string_cspn (field1, ifs1, '\0'); field1 = string_spn (end_field1, ifs1, '\0'); fieldno1++; } if ( fieldno1 >= fieldno_upper_limit ) { printf (_("@ Line %lu in file \"%s\"\n contains too many fields to be properly processed!\n"), lineno1, argl->file1); exit (EXIT_TROUBLE); } /* Ignore the fields selected through the option -X 2: */ while ( *field2 != '\0' && fieldno2 < fieldno_upper_limit && (argl->ghostmask2[fieldno2 >> 3] & 0x80 >> (fieldno2 & 0x7)) ) { end_field2 = string_cspn (field2, ifs2, '\0'); field2 = string_spn (end_field2, ifs2, '\0'); fieldno2++; } if ( fieldno2 >= fieldno_upper_limit ) { printf (_("@ Line %lu in file \"%s\"\n contains too many fields to be properly processed!\n"), lineno2, argl->file2); exit (EXIT_TROUBLE); } if (*field1 != '\0') { if (output_mode >= OUTMODE_NORMAL) { if ((_1sttime)) { print_lines (line1, line2, lineno1, lineno2, output_mode < OUTMODE_VERBOSE); _1sttime = 0; } print_fields (field1, field2, 0, 0, lineno1, lineno2, fieldno1, fieldno2); printf (_("@ Line %lu in file \"%s\" is shorter than expected!\n"), lineno2, argl->file2); } else if (output_mode == OUTMODE_RAW) { printf ("%lu:%lu:%lu:*:%s", lineno1, lineno2, fieldno1+1, field1); } return 1; } else if (*field2 != '\0') { if (output_mode >= OUTMODE_NORMAL) { if ((_1sttime)) { print_lines (line1, line2, lineno1, lineno2, output_mode < OUTMODE_VERBOSE); _1sttime = 0; } print_fields (field1, field2, 0, 0, lineno1, lineno2, fieldno1, fieldno2); printf (_("@ Line %lu in file \"%s\" is shorter than expected!\n"), lineno1, argl->file1); } else if (output_mode == OUTMODE_RAW) { printf ("%lu:%lu:*:%lu:%s", lineno1, lineno2, fieldno2+1, field2); } return 1; } else return lines_differ; } } extern char** def_ifs; int cmp_files (FILE* pf1, FILE* pf2, const argslist* argl, statlist* statres) { char *line1, *line2, **ifs1, **ifs2; int err1, err2, files_differ = 0; unsigned long lineno1 = 1, lineno2 = 1; size_t n; unsigned short i; unsigned char byte, elem; flg_array table = copy_of_intflagtab(); ifs1 = (!argl->ifs1) ? def_ifs : argl->ifs1; ifs2 = (!argl->ifs2) ? def_ifs : argl->ifs2; if ( (table.ptr) ) { /* Filter on */ for (n = 0, err1 = err2 = OK; n < table.len; n += 4U) { byte = table.ptr[n/4U]; for (i = 0; i < 4U; i++) { elem = (byte & 0x03 << 2*i) >> 2 * i; switch (elem) { case 1: line1 = read_line (pf1, &err1); line2 = NULL; break; case 2: line1 = NULL; line2 = read_line (pf2, &err2); break; case 3: line1 = read_line (pf1, &err1); line2 = read_line (pf2, &err2); break; case 0: goto catch_error; } if ( (cmp_lines (line1, line2, lineno1, lineno2, (const char**) ifs1, (const char**) ifs2, argl, statres)) ) { files_differ = 1; if (argl->output_mode == OUTMODE_OVERVIEW) print_1overview_line (line1, 1, line2); } else { if (argl->output_mode == OUTMODE_OVERVIEW && !suppress_common_lines) print_1overview_line (line1, 0, line2); } if ((line1)) { lineno1++; free ((void*)line1); } if ((line2)) { lineno2++; free ((void*)line2); } if (err1 == OUT_OF_MEMORY || err2 == OUT_OF_MEMORY || err1 == FILE_IS_BINARY || err2 == FILE_IS_BINARY || err1 == READING_ERROR || err2 == READING_ERROR) goto catch_error; } } } /* end of `if ( (table.ptr) )'*/ else { /* Filter off */ do { line1 = read_line (pf1, &err1); line2 = read_line (pf2, &err2); if ( (cmp_lines (line1, line2, lineno1, lineno2, (const char**) ifs1, (const char**) ifs2, argl, statres)) ) { files_differ = 1; if (argl->output_mode == OUTMODE_OVERVIEW) print_1overview_line (line1, 1, line2); } else { if (argl->output_mode == OUTMODE_OVERVIEW && !suppress_common_lines) print_1overview_line (line1, 0, line2); } if ((line1)) free ((void*)line1); if ((line2)) free ((void*)line2); lineno1++, lineno2++; } while (err1 == OK && err2 == OK); } catch_error: /* * If we arrive here, then * * either ist n == table.len, * or elem == 0, * or either err1 or err2 is different from OK. */ fflush (stdout); if ( (table.ptr) ) { if (n >= table.len || !elem) return files_differ; } if (err1 == OK) { switch (err2) { case FILE_IS_BINARY: fprintf (stderr, _("\n*** File \"%s\" is binary,\n*** cannot read from it\n"), argl->file2); return FILE_IS_BINARY; case READING_ERROR: fprintf (stderr, _("\n*** Error while reading from file \"%s\"\n"), argl->file2); return READING_ERROR; case OUT_OF_MEMORY: fprintf (stderr, _("\n*** Out of memory while reading from file \"%s\"\n"), argl->file2); return OUT_OF_MEMORY; case LINE_INTERR: if (getc (pf1) == EOF) break; /* default == EOF_REACHED */ default: fprintf (stderr, _("\n*** End of file \"%s\" reached while trying to read line %lu.\n"), argl->file2, lineno2-1); fprintf (stderr, _("*** File \"%s\" has more lines than file \"%s\",\n"), argl->file1, argl->file2); fprintf (stderr, _("*** line %lu is the last one read from file \"%s\"\n\n"), lineno1-1, argl->file1); } return files_differ; } else if (err1 == LINE_INTERR) { switch (err2) { case FILE_IS_BINARY: fprintf (stderr, _("\n*** File \"%s\" is binary,\n*** cannot read from it\n"), argl->file2); return FILE_IS_BINARY; case READING_ERROR: fprintf (stderr, _("\n*** Error while reading from file \"%s\"\n"), argl->file2); return READING_ERROR; case OUT_OF_MEMORY: fprintf (stderr, _("\n*** Out of memory while reading from file \"%s\"\n"), argl->file2); return OUT_OF_MEMORY; case OK: if (getc (pf2) != EOF) { fprintf (stderr, _("\n*** End of file \"%s\" reached while trying to read line %lu.\n"), argl->file1, lineno1-1); fprintf (stderr, _("*** File \"%s\" has more lines than file \"%s\",\n"), argl->file2, argl->file1); fprintf (stderr, _("*** line %lu is the last one read from file \"%s\"\n\n"), lineno2-1, argl->file2); } break; case EOF_REACHED: fprintf (stderr, _("\n*** End of file \"%s\" reached while trying to read line %lu.\n"), argl->file2, lineno2-1); fprintf (stderr, _("*** File \"%s\" has more lines than file \"%s\",\n"), argl->file1, argl->file2); fprintf (stderr, _("*** line %lu is the last one read from file \"%s\"\n\n"), lineno1-1, argl->file1); /* No particular action to do if err2 == LINE_INTERR */ } return files_differ; } else if (err1 == EOF_REACHED) { switch (err2) { case FILE_IS_BINARY: fprintf (stderr, _("\n*** File \"%s\" is binary,\n*** cannot read from it\n"), argl->file2); return FILE_IS_BINARY; case READING_ERROR: fprintf (stderr, _("\n*** Error while reading from file \"%s\"\n"), argl->file2); return READING_ERROR; case OUT_OF_MEMORY: fprintf (stderr, _("\n*** Out of memory while reading from file \"%s\"\n"), argl->file2); return OUT_OF_MEMORY; case OK: case LINE_INTERR: fprintf (stderr, _("\n*** End of file \"%s\" reached while trying to read line %lu.\n"), argl->file1, lineno1-1); fprintf (stderr, _("*** File \"%s\" has more lines than file \"%s\",\n"), argl->file2, argl->file1); fprintf (stderr, _("*** line %lu is the last one read from file \"%s\"\n\n"), lineno2-1, argl->file2); } return files_differ; } else if (err1 == FILE_IS_BINARY) { fprintf (stderr, _("\n*** File \"%s\" is binary,\n*** cannot read from it\n"), argl->file1); return FILE_IS_BINARY; } else if (err1 == READING_ERROR) { fprintf (stderr, _("\n*** Error while reading from file \"%s\"\n"), argl->file1); return READING_ERROR; } else /* err1 == OUT_OF_MEMORY */ { fprintf (stderr, _("\n*** Out of memory while reading from file \"%s\"\n"), argl->file1); return OUT_OF_MEMORY; } } numdiff-5.9.0/NEWS0000644000175000017500000002247013054341114013201 0ustar paologpaolog5.8.1 --> 5.9.0 (Ivano Primi ) : * New option --raw for printing the differences between the compared files in raw format (the raw format is not convenient for humans but is very compact and can be easily parsed by other programs). * The output of the option -S includes now the positions of the first occurrences in the compared files of the largest absolute/relative error. * Thanks to Elias Pipping, the issue with long execution times and overloading of the processor in case Numdiff had been built against GNU MP with optimization enabled is now solved. * Documentation updated and corrected where needed. 5.8.0 --> 5.8.1 (Ivano Primi ) : * The distribution terms of the documentation have been slightly changed to comply with Debian policies. 5.6.1 --> 5.8.0 (Ivano Primi ) : * Ndselect recognizes now the following additional options: # -O to specify the string to use as separator while writing the selected fields to the standard output, # -D to specify the set of strings to use as delimiters while splitting the input lines into fields. * The long option --separator of Numdiff/Ndselect has been changed to --separators and its help message has been improved. * The options -s of Numdiff and -S of Ndselect recognize and accept now a larger set of escape sequences. * Numdiff can detect now if any of the files to compare is binary and return a suitable error message. * The short form of Numdiff option --dummy is not -D anymore, but -U. * Numdiff accepts now the option --delimiters (short form: -D) to specify the set of strings to use as delimiters while splitting the input lines into fields. * The option --currency of Numdiff now recognizes and accepts escape sequences in its argument. 5.6.0 --> 5.6.1 (Ivano Primi ) : * Added instruction to Makefile.in to create the directory for the man pages in case it does not exist yet. 5.2.1 --> 5.6.0 (Ivano Primi ) : * Several bugs have been corrected: # Fixed improper handling of the last line of a file when no trailing newline is present at its end. # Array overrun in function find_and_hash_each_file. # Fixed two bugs which prevented Numdiff to be built on Cygwin. Thanks to Satish Balay for the report. # Numdiff is not linked anymore against the GNU Multiple Precision Arithmetic Library if --disable-gmp is passed to the configure script. * Numdiff recognizes now the following additional options: # -O for the "overview" mode, # -B to treat the compared files as binary files (only meaningful under MSDog/MSWindog), # -c to set the currency name for the two files to compare, # -F to change the formula used to compute the relative errors. * Added new entries to Numdiff help which explain how to use the new options. * The options -a and -r accept now an extended syntax which allows to specify to which fields the given threshold applies. The option -r does not accept anymore the prefixes 1: and 2: (use -F instead). * Several help messages of Numdiff have been improved. * Several error and warning messages of Numdiff have been improved. * ndselect allows now to select not only the lines but also the fields that have to be printed. It recognizes then the following additional options: # -F to set the number of the first field to print, # -L to set the number of the last field that can be printed, # -I to set the increment to use when selecting the fields to print, # -S to specify the set of characters to use to split the input lines into fields, # -x to avoid to print empty lines. * Added new entries to ndselect help which explain how to use the new options. * Several help messages of ndselect have been improved. * Added man pages for numdiff and ndselect. * Documentation, i18n and italian l10n have been updated. 5.2.0 --> 5.2.1 (Ivano Primi ) : * Corrected a bug which prevented Numdiff to be built on MacOS X(R). Thanks to Antoine Dechaume for the report. 5.0.0 --> 5.2.0 (Ivano Primi ) : * Numdiff uses now the GNU Multiple Precision Arithmetic Library (also called GNU MP or GMP) if this library is available at build-time. The old internal support for multiple precision arithmetic is a fall-back in case GNU MP is absent. However it is possible to use the internal support for multiple precision arithmetic even when GNU MP is available: it is sufficient to pass the option --disable-gmp (or --enable-gmp=no) to the configure script before building the program. After building and installing Numdiff, it is possible to know whether it has been linked against GNU MP or not just by calling the program with the option -v. In case of link against GMP the program tells also which version of GNU MP it uses to perform its computations. 5.0.0 beta4 --> 5.0.0 (Ivano Primi ) : * The filter has been improved, now it gets no more confused if the same value is represented in scientific notation in one file and in common decimal notation in the other file. * The Makefile.in (and consequently the Makefile) has been modified to conform to the GNU Coding Standards. * Now numdiff and ndselect accept long options too (for instance --separator='\n\t %' instead of -s '\n\t %'). * The option -r accepts now an additional parameter which tells to compute the relative differences always with respect to the values in one file, instead of using the classic formula for the relative error. * The argument of the option -f has been made optional. * Documentation, i18n and italian l10n have been updated. 5.0.0 beta1 --> 5.0.0 beta4 (Ivano Primi ) : * Added additional information to the report printed by the option -S. * Now the program can accept the options with argument -z INT, -Z INT, -X INT as short equivalent forms of -z 1:INT -z 2:INT, -Z 1:INT -Z 2:INT and -X 1:INT -X 2:INT respectively. * The option -R has been removed since not useful. * The option -s has now an extended syntax allowing to specify different sets of field delimiters for the two files to compare. * Adoption of the version 1.3 of the GNU Free Documentation License for the TeXinfo documentation. * Now the test programs are not anymore distributed together with the source code of Numdiff. 4.2.0 --> 5.0.0 beta1 (Ivano Primi ) : * Removed the support for double, long double and high precision arithmetic. Now only multiple precision arithmetic is available (but it is not a limitation :) ). * Removed the option -L, since the tool ndselect made it obsolete. * Implemented a synchronization procedure to detect insertions/deletions of lines. To accomplish this, source code from GNU diff (diffutils 2.8.1) has been used (with the necessary modifications). Added the options -f, -z, -Z, -R, -m, -H, -T. * Removed the option -F, -X is now used in place of it. * Added new entries to the help which explain how to use the new options. * The output format has been slightly changed. * Makefile and configuration scripts have been changed, since the code has become much more complex than it was. * Added more tests to check that the new features are correctly working. * Change of the license: from GPL version 2 or later to GPL version 3 or later. The copyright statement of my files has been consequently updated. Also the message shown by 'numdiff -v'. 4.0.0 --> 4.2.0 (Ivano Primi ) : * Changed the way the options -V and -b interact when they are both set. * Added new tests. * Now, when the options -v and -h are both set, Numdiff displays before the information about version, Copyright and NO-Warranty and then the help message. * The Copyright has been updated. * Added the tools `ndfilter' and `ndselect'. * i18n and italian l10n updated. * The documentation has been consequently updated. 3.0.2 --> 4.0.0 (Ivano Primi ) : * New output format. At the same time the code printing the output has been cleaned. * Added the -V option for the "verbose" mode. * Better handling of the last line of a file. * i18n, l10n and documentation have been consequently updated. 3.0.1 --> 3.0.2 (Ivano Primi ) : * The code of the function Cabs() has been improved for both double and long-double precision. * Fixed a compilation error which occurred when one chose to activate the double, the long-double or the high precision instead of the multiple precision arithmetic. This compilation error was introduced just before releasing the version 3.0 of Numdiff . 3.0 --> 3.0.1 (Ivano Primi ) : * The code of the function Cabs() has been modified in order to speed up the execution when working with real numbers (the change concerned only the code for multiple precision arithmetic). 3.0 (Ivano Primi ) : * First public release numdiff-5.9.0/number.h0000644000175000017500000001044013054341114014135 0ustar paologpaolog/* number.h: Arbitrary precision numbers header file. */ /* Copyright (C) 1991, 1992, 1993, 1994, 1997, 2000 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to: The Free Software Foundation, Inc. 59 Temple Place, Suite 330 Boston, MA 02111-1307 USA. You may contact the author by: e-mail: philnelson@acm.org us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ #ifndef _NUMBER_H_ #define _NUMBER_H_ typedef enum {PLUS, MINUS} sign; typedef struct bc_struct *bc_num; typedef struct bc_struct { sign n_sign; int n_len; /* The number of digits before the decimal point. */ int n_scale; /* The number of digits after the decimal point. */ int n_refs; /* The number of pointers to this number. */ bc_num n_next; /* Linked list for available list. */ char *n_ptr; /* The pointer to the actual storage. If NULL, n_value points to the inside of another number (bc_multiply...) and should not be "freed." */ char *n_value; /* The number. Not zero char terminated. May not point to the same place as n_ptr as in the case of leading zeros generated. */ } bc_struct; /* The base used in storing the numbers in n_value above. Currently this MUST be 10. */ #define BASE 10 /* Some useful macros and constants. */ #define CH_VAL(c) (c - '0') #define BCD_CHAR(d) (d + '0') #ifdef MIN #undef MIN #undef MAX #endif #define MAX(a,b) ((a)>(b)?(a):(b)) #define MIN(a,b) ((a)>(b)?(b):(a)) #define ODD(a) ((a)&1) #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif #ifndef LONG_MAX #define LONG_MAX 0x7ffffff #endif /* Global numbers. */ extern bc_num _zero_; extern bc_num _one_; extern bc_num _two_; /* Function Prototypes */ /* Define the _PROTOTYPE macro if it is needed. */ #ifndef _PROTOTYPE #ifdef __STDC__ #define _PROTOTYPE(func, args) func args #else #define _PROTOTYPE(func, args) func() #endif #endif _PROTOTYPE(void bc_init_numbers, (void)); _PROTOTYPE(void bc_end, (void)); /* Added by Ivano Primi, 30/12/2002. */ _PROTOTYPE(bc_num bc_new_num, (int length, int scale)); _PROTOTYPE(void bc_free_num, (bc_num *num)); _PROTOTYPE(bc_num bc_copy_num, (bc_num num)); _PROTOTYPE(void bc_init_num, (bc_num *num)); _PROTOTYPE(void bc_str2num, (bc_num *num, char *str, int scale)); _PROTOTYPE(char *bc_num2str, (bc_num num)); _PROTOTYPE(void bc_int2num, (bc_num *num, int val)); _PROTOTYPE(long bc_num2long, (bc_num num)); _PROTOTYPE(int bc_compare, (bc_num n1, bc_num n2)); _PROTOTYPE(char bc_is_zero, (bc_num num)); _PROTOTYPE(char bc_is_near_zero, (bc_num num, int scale)); _PROTOTYPE(char bc_is_neg, (bc_num num)); _PROTOTYPE(void bc_add, (bc_num n1, bc_num n2, bc_num *result, int scale_min)); _PROTOTYPE(void bc_sub, (bc_num n1, bc_num n2, bc_num *result, int scale_min)); _PROTOTYPE(void bc_multiply, (bc_num n1, bc_num n2, bc_num *prod, int scale)); _PROTOTYPE(int bc_divide, (bc_num n1, bc_num n2, bc_num *quot, int scale)); _PROTOTYPE(int bc_modulo, (bc_num num1, bc_num num2, bc_num *result, int scale)); _PROTOTYPE(int bc_divmod, (bc_num num1, bc_num num2, bc_num *quot, bc_num *rem, int scale)); _PROTOTYPE(int bc_raisemod, (bc_num base, bc_num expo, bc_num mod, bc_num *result, int scale)); _PROTOTYPE(void bc_raise, (bc_num num1, bc_num num2, bc_num *result, int scale)); _PROTOTYPE(int bc_sqrt, (bc_num *num, int scale)); _PROTOTYPE(void bc_out_num, (bc_num num, int o_base, void (* out_char)(int), int leading_zero)); #endif numdiff-5.9.0/shtool0000755000175000017500000042514613054341114013747 0ustar paologpaolog#!/bin/sh ## ## GNU shtool -- The GNU Portable Shell Tool ## Copyright (c) 1994-2008 Ralf S. Engelschall ## ## See http://www.gnu.org/software/shtool/ for more information. ## See ftp://ftp.gnu.org/gnu/shtool/ for latest version. ## ## Version: 2.0.8 (18-Jul-2008) ## Contents: all available modules ## ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, ## USA, or contact Ralf S. Engelschall . ## ## NOTICE: Given that you include this file verbatim into your own ## source tree, you are justified in saying that it remains separate ## from your package, and that this way you are simply just using GNU ## shtool. So, in this situation, there is no requirement that your ## package itself is licensed under the GNU General Public License in ## order to take advantage of GNU shtool. ## ## ## Usage: shtool [] [ [] []] ## ## Available commands: ## echo Print string with optional construct expansion ## mdate Pretty-print modification time of a file or dir ## table Pretty-print a field-separated list as a table ## prop Display progress with a running propeller ## move Move files with simultaneous substitution ## install Install a program, script or datafile ## mkdir Make one or more directories ## mkln Make link with calculation of relative paths ## mkshadow Make a shadow tree through symbolic links ## fixperm Fix file permissions inside a source tree ## rotate Logfile rotation ## tarball Roll distribution tarballs ## subst Apply sed(1) substitution operations ## platform Platform Identification Utility ## arx Extended archive command ## slo Separate linker options by library class ## scpp Sharing C Pre-Processor ## version Maintain a version information file ## path Deal with program paths ## # maximum Bourne-Shell compatibility if [ ".$ZSH_VERSION" != . ] && (emulate sh) >/dev/null 2>&1; then # reconfigure zsh(1) emulate sh NULLCMD=: alias -g '${1+"$@"}'='"$@"' elif [ ".$BASH_VERSION" != . ] && (set -o posix) >/dev/null 2>&1; then # reconfigure bash(1) set -o posix fi # maximum independence of NLS nuisances for var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $var=C; export $var) 2>&1`"); then eval $var=C; export $var else unset $var fi done # initial command line handling if [ $# -eq 0 ]; then echo "$0:Error: invalid command line" 1>&2 echo "$0:Hint: run \`$0 -h' for usage" 1>&2 exit 1 fi if [ ".$1" = ".-h" ] || [ ".$1" = ".--help" ]; then echo "This is GNU shtool, version 2.0.8 (18-Jul-2008)" echo 'Copyright (c) 1994-2008 Ralf S. Engelschall ' echo 'Report bugs to ' echo '' echo 'Usage: shtool [] [ [] []]' echo '' echo 'Available global :' echo ' -v, --version display shtool version information' echo ' -h, --help display shtool usage help page (this one)' echo ' -d, --debug display shell trace information' echo ' -r, --recreate recreate this shtool script via shtoolize' echo '' echo 'Available [] []:' echo ' echo [-n|--newline] [-e|--expand] [ ...]' echo ' mdate [-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits]' echo ' [-f|--field-sep ] [-o|--order ] ' echo ' table [-F|--field-sep ] [-w|--width ] [-c|--columns' echo ' ] [-s|--strip ] ...' echo ' prop [-p|--prefix ]' echo ' move [-v|--verbose] [-t|--trace] [-e|--expand] [-p|--preserve]' echo ' ' echo ' install [-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy]' echo ' [-C|--compare-copy] [-s|--strip] [-m|--mode ]' echo ' [-o|--owner ] [-g|--group ] [-e|--exec' echo ' ] [ ...] ' echo ' mkdir [-t|--trace] [-f|--force] [-p|--parents] [-m|--mode' echo ' ] [-o|--owner ] [-g|--group ] ' echo ' [ ...]' echo ' mkln [-t|--trace] [-f|--force] [-s|--symbolic] ' echo ' [ ...] ' echo ' mkshadow [-v|--verbose] [-t|--trace] [-a|--all] ' echo ' fixperm [-v|--verbose] [-t|--trace] [ ...]' echo ' rotate [-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files' echo ' ] [-s|--size ] [-c|--copy] [-r|--remove]' echo ' [-a|--archive-dir ] [-z|--compress [:]]' echo ' [-b|--background] [-d|--delay] [-p|--pad ] [-m|--mode' echo ' ] [-o|--owner ] [-g|--group ] [-M|--migrate' echo ' ] [-P|--prolog ] [-E|--epilog ] [...]' echo ' tarball [-t|--trace] [-v|--verbose] [-o|--output ]' echo ' [-c|--compress ] [-d|--directory ] [-u|--user' echo ' ] [-g|--group ] [-e|--exclude ]' echo ' [ ...]' echo ' subst [-v|--verbose] [-t|--trace] [-n|--nop] [-w|--warning]' echo ' [-q|--quiet] [-s|--stealth] [-i|--interactive] [-b|--backup' echo ' ] [-e|--exec ] [-f|--file ] []' echo ' [...]' echo ' platform [-F|--format ] [-S|--sep ] [-C|--conc' echo ' ] [-L|--lower] [-U|--upper] [-v|--verbose]' echo ' [-c|--concise] [-n|--no-newline] [-t|--type ]' echo ' [-V|--version] [-h|--help]' echo ' arx [-t|--trace] [-C|--command ] [' echo ' ...]' echo ' slo [-p|--prefix ] -- -L -l [-L -l' echo ' ...]' echo ' scpp [-v|--verbose] [-p|--preserve] [-f|--filter ]' echo ' [-o|--output ] [-t|--template ] [-M|--mark' echo ' ] [-D|--define ] [-C|--class ]' echo ' [ ...]' echo ' version [-l|--language ] [-n|--name ] [-p|--prefix' echo ' ] [-s|--set ] [-e|--edit] [-i|--increase' echo ' ] [-d|--display ] ' echo ' path [-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename]' echo ' [-m|--magic] [-p|--path ] [ ...]' echo '' exit 0 fi if [ ".$1" = ".-v" ] || [ ".$1" = ".--version" ]; then echo "GNU shtool 2.0.8 (18-Jul-2008)" exit 0 fi if [ ".$1" = ".-r" ] || [ ".$1" = ".--recreate" ]; then shtoolize -oshtool all exit 0 fi if [ ".$1" = ".-d" ] || [ ".$1" = ".--debug" ]; then shift set -x fi name=`echo "$0" | sed -e 's;.*/\([^/]*\)$;\1;' -e 's;-sh$;;' -e 's;\.sh$;;'` case "$name" in echo|mdate|table|prop|move|install|mkdir|mkln|mkshadow|fixperm|rotate|tarball|subst|platform|arx|slo|scpp|version|path ) # implicit tool command selection tool="$name" ;; * ) # explicit tool command selection tool="$1" shift ;; esac arg_spec="" opt_spec="" gen_tmpfile=no ## ## DISPATCH INTO SCRIPT PROLOG ## case $tool in echo ) str_tool="echo" str_usage="[-n|--newline] [-e|--expand] [ ...]" arg_spec="0+" opt_spec="n.e." opt_alias="n:newline,e:expand" opt_n=no opt_e=no ;; mdate ) str_tool="mdate" str_usage="[-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits] [-f|--field-sep ] [-o|--order ] " arg_spec="1=" opt_spec="n.z.s.d.f:o:" opt_alias="n:newline,z:zero,s:shorten,d:digits,f:field-sep,o:order" opt_n=no opt_z=no opt_s=no opt_d=no opt_f=" " opt_o="dmy" ;; table ) str_tool="table" str_usage="[-F|--field-sep ] [-w|--width ] [-c|--columns ] [-s|--strip ] ..." arg_spec="1+" opt_spec="F:w:c:s:" opt_alias="F:field-sep,w:width,c:columns,s:strip" opt_F=":" opt_w=15 opt_c=3 opt_s=79 ;; prop ) str_tool="prop" str_usage="[-p|--prefix ]" arg_spec="0=" opt_spec="p:" opt_alias="p:prefix" opt_p="" ;; move ) str_tool="move" str_usage="[-v|--verbose] [-t|--trace] [-e|--expand] [-p|--preserve] " arg_spec="2=" opt_spec="v.t.e.p." opt_alias="v:verbose,t:trace,e:expand,p:preserve" opt_v=no opt_t=no opt_e=no opt_p=no ;; install ) str_tool="install" str_usage="[-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy] [-C|--compare-copy] [-s|--strip] [-m|--mode ] [-o|--owner ] [-g|--group ] [-e|--exec ] [ ...] " arg_spec="1+" opt_spec="v.t.d.c.C.s.m:o:g:e+" opt_alias="v:verbose,t:trace,d:mkdir,c:copy,C:compare-copy,s:strip,m:mode,o:owner,g:group,e:exec" opt_v=no opt_t=no opt_d=no opt_c=no opt_C=no opt_s=no opt_m="0755" opt_o="" opt_g="" opt_e="" ;; mkdir ) str_tool="mkdir" str_usage="[-t|--trace] [-f|--force] [-p|--parents] [-m|--mode ] [-o|--owner ] [-g|--group ] [ ...]" arg_spec="1+" opt_spec="t.f.p.m:o:g:" opt_alias="t:trace,f:force,p:parents,m:mode,o:owner,g:group" opt_t=no opt_f=no opt_p=no opt_m="" opt_o="" opt_g="" ;; mkln ) str_tool="mkln" str_usage="[-t|--trace] [-f|--force] [-s|--symbolic] [ ...] " arg_spec="2+" opt_spec="t.f.s." opt_alias="t:trace,f:force,s:symbolic" opt_t=no opt_f=no opt_s=no ;; mkshadow ) str_tool="mkshadow" str_usage="[-v|--verbose] [-t|--trace] [-a|--all] " arg_spec="2=" opt_spec="v.t.a." opt_alias="v:verbose,t:trace,a:all" opt_v=no opt_t=no opt_a=no ;; fixperm ) str_tool="fixperm" str_usage="[-v|--verbose] [-t|--trace] [ ...]" arg_spec="1+" opt_spec="v.t." opt_alias="v:verbose,t:trace" opt_v=no opt_t=no ;; rotate ) str_tool="rotate" str_usage="[-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files ] [-s|--size ] [-c|--copy] [-r|--remove] [-a|--archive-dir ] [-z|--compress [:]] [-b|--background] [-d|--delay] [-p|--pad ] [-m|--mode ] [-o|--owner ] [-g|--group ] [-M|--migrate ] [-P|--prolog ] [-E|--epilog ] [...]" arg_spec="1+" opt_spec="v.t.f.n:s:c.r.a:z:b.d.p:o:g:m:M:P:E:" opt_alias="v:verbose,t:trace,f:force,n:num-files,s:size,c:copy,r:remove,a:archive-dir,z:compress,b:background,d:delay,p:pad,o:owner,g:group,m:mode,M:migrate,P:prolog,E:epilog" opt_v=no opt_t=no opt_f=no opt_n=10 opt_s="" opt_c=no opt_r=no opt_a="" opt_z="" opt_b=no opt_d=no opt_p=1 opt_o="" opt_g="" opt_m="" opt_M="" opt_P="" opt_E="" ;; tarball ) str_tool="tarball" str_usage="[-t|--trace] [-v|--verbose] [-o|--output ] [-c|--compress ] [-d|--directory ] [-u|--user ] [-g|--group ] [-e|--exclude ] [ ...]" gen_tmpfile=yes arg_spec="1+" opt_spec="t.v.o:c:d:u:g:e:" opt_alias="t:trace,v:verbose,o:output,c:compress,d:directory,u:user,g:group,e:exclude" opt_t=no opt_v=no opt_o="" opt_c="" opt_d="" opt_u="" opt_g="" opt_e="CVS,\\.cvsignore,\\.svn,\\.[oa]\$" ;; subst ) str_tool="subst" str_usage="[-v|--verbose] [-t|--trace] [-n|--nop] [-w|--warning] [-q|--quiet] [-s|--stealth] [-i|--interactive] [-b|--backup ] [-e|--exec ] [-f|--file ] [] [...]" gen_tmpfile=yes arg_spec="0+" opt_spec="v.t.n.w.q.s.i.b:e+f:" opt_alias="v:verbose,t:trace,n:nop,w:warning,q:quiet,s:stealth,i:interactive,b:backup,e:exec,f:file" opt_v=no opt_t=no opt_n=no opt_w=no opt_q=no opt_s=no opt_i=no opt_b="" opt_e="" opt_f="" ;; platform ) str_tool="platform" str_usage="[-F|--format ] [-S|--sep ] [-C|--conc ] [-L|--lower] [-U|--upper] [-v|--verbose] [-c|--concise] [-n|--no-newline] [-t|--type ] [-V|--version] [-h|--help]" arg_spec="0=" opt_spec="F:S:C:L.U.v.c.n.t:d.V.h." opt_alias="F:format,S:sep,C:conc,L:lower,U:upper,v:verbose,c:consise,t:type,n:no-newline,V:version,h:help" opt_F="%{sp} (%{ap})" opt_S=" " opt_C="/" opt_L=no opt_U=no opt_t="" opt_v=no opt_c=no opt_n=no opt_V=no opt_h=no ;; arx ) str_tool="arx" str_usage="[-t|--trace] [-C|--command ] [ ...]" arg_spec="2+" opt_spec="t.C:" opt_alias="t:trace,C:command" opt_t=no opt_C="ar" ;; slo ) str_tool="slo" str_usage="[-p|--prefix ] -- -L -l [-L -l ...]" arg_spec="1+" opt_spec="p:" opt_alias="p:prefix" opt_p="SLO_" ;; scpp ) str_tool="scpp" str_usage="[-v|--verbose] [-p|--preserve] [-f|--filter ] [-o|--output ] [-t|--template ] [-M|--mark ] [-D|--define ] [-C|--class ] [ ...]" gen_tmpfile=yes arg_spec="1+" opt_spec="v.p.f+o:t:M:D:C:" opt_alias="v:verbose,p:preserve,f:filter,o:output,t:template,M:mark,D:define,C:class" opt_v=no opt_p=no opt_f="" opt_o="lib.h" opt_t="lib.h.in" opt_M="%%MARK%%" opt_D="cpp" opt_C="intern" ;; version ) str_tool="version" str_usage="[-l|--language ] [-n|--name ] [-p|--prefix ] [-s|--set ] [-e|--edit] [-i|--increase ] [-d|--display ] " arg_spec="1=" opt_spec="l:n:p:s:i:e.d:" opt_alias="l:language,n:name,p:prefix,s:set,e:edit,i:increase,d:display" opt_l="txt" opt_n="unknown" opt_p="" opt_s="" opt_e="no" opt_i="" opt_d="short" ;; path ) str_tool="path" str_usage="[-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename] [-m|--magic] [-p|--path ] [ ...]" gen_tmpfile=yes arg_spec="1+" opt_spec="s.r.d.b.m.p:" opt_alias="s:suppress,r:reverse,d:dirname,b:basename,m:magic,p:path" opt_s=no opt_r=no opt_d=no opt_b=no opt_m=no opt_p="$PATH" ;; -* ) echo "$0:Error: unknown option \`$tool'" 2>&1 echo "$0:Hint: run \`$0 -h' for usage" 2>&1 exit 1 ;; * ) echo "$0:Error: unknown command \`$tool'" 2>&1 echo "$0:Hint: run \`$0 -h' for usage" 2>&1 exit 1 ;; esac ## ## COMMON UTILITY CODE ## # commonly used ASCII values ASC_TAB=" " ASC_NL=" " # determine name of tool if [ ".$tool" != . ]; then # used inside shtool script toolcmd="$0 $tool" toolcmdhelp="shtool $tool" msgprefix="shtool:$tool" else # used as standalone script toolcmd="$0" toolcmdhelp="sh $0" msgprefix="$str_tool" fi # parse argument specification string eval `echo $arg_spec |\ sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'` # parse option specification string eval `echo h.$opt_spec |\ sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'` # parse option alias string eval `echo h:help,$opt_alias |\ sed -e 's/-/_/g' -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'` # interate over argument line opt_PREV='' while [ $# -gt 0 ]; do # special option stops processing if [ ".$1" = ".--" ]; then shift break fi # determine option and argument opt_ARG_OK=no if [ ".$opt_PREV" != . ]; then # merge previous seen option with argument opt_OPT="$opt_PREV" opt_ARG="$1" opt_ARG_OK=yes opt_PREV='' else # split argument into option and argument case "$1" in --[a-zA-Z0-9]*=*) eval `echo "x$1" |\ sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'` opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" ;; --[a-zA-Z0-9]*) opt_OPT=`echo "x$1" | cut -c4-` opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" opt_ARG='' ;; -[a-zA-Z0-9]*) eval `echo "x$1" |\ sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \ -e 's/";\(.*\)$/"; opt_ARG="\1"/'` ;; -[a-zA-Z0-9]) opt_OPT=`echo "x$1" | cut -c3-` opt_ARG='' ;; *) break ;; esac fi # eat up option shift # determine whether option needs an argument eval "opt_MODE=\$opt_MODE_${opt_OPT}" if [ ".$opt_ARG" = . ] && [ ".$opt_ARG_OK" != .yes ]; then if [ ".$opt_MODE" = ".:" ] || [ ".$opt_MODE" = ".+" ]; then opt_PREV="$opt_OPT" continue fi fi # process option case $opt_MODE in '.' ) # boolean option eval "opt_${opt_OPT}=yes" ;; ':' ) # option with argument (multiple occurances override) eval "opt_${opt_OPT}=\"\$opt_ARG\"" ;; '+' ) # option with argument (multiple occurances append) eval "opt_${opt_OPT}=\"\$opt_${opt_OPT}\${ASC_NL}\$opt_ARG\"" ;; * ) echo "$msgprefix:Error: unknown option: \`$opt_OPT'" 1>&2 echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 exit 1 ;; esac done if [ ".$opt_PREV" != . ]; then echo "$msgprefix:Error: missing argument to option \`$opt_PREV'" 1>&2 echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 exit 1 fi # process help option if [ ".$opt_h" = .yes ]; then echo "Usage: $toolcmdhelp $str_usage" exit 0 fi # complain about incorrect number of arguments case $arg_MODE in '=' ) if [ $# -ne $arg_NUMS ]; then echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2 echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 exit 1 fi ;; '+' ) if [ $# -lt $arg_NUMS ]; then echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2 echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 exit 1 fi ;; esac # establish a temporary file on request if [ ".$gen_tmpfile" = .yes ]; then # create (explicitly) secure temporary directory if [ ".$TMPDIR" != . ]; then tmpdir="$TMPDIR" elif [ ".$TEMPDIR" != . ]; then tmpdir="$TEMPDIR" else tmpdir="/tmp" fi tmpdir="$tmpdir/.shtool.$$" ( umask 077 rm -rf "$tmpdir" >/dev/null 2>&1 || true mkdir "$tmpdir" >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "$msgprefix:Error: failed to create temporary directory \`$tmpdir'" 1>&2 exit 1 fi ) # create (implicitly) secure temporary file tmpfile="$tmpdir/shtool.tmp" touch "$tmpfile" fi # utility function: map string to lower case util_lower () { echo "$1" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' } # utility function: map string to upper case util_upper () { echo "$1" | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' } # cleanup procedure shtool_exit () { rc="$1" if [ ".$gen_tmpfile" = .yes ]; then rm -rf "$tmpdir" >/dev/null 2>&1 || true fi exit $rc } ## ## DISPATCH INTO SCRIPT BODY ## case $tool in echo ) ## ## echo -- Print string with optional construct expansion ## Copyright (c) 1998-2008 Ralf S. Engelschall ## text="$*" # check for broken escape sequence expansion seo='' bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'` if [ ".$bytes" != .3 ]; then bytes=`echo -E '\1' | wc -c | awk '{ printf("%s", $1); }'` if [ ".$bytes" = .3 ]; then seo='-E' fi fi # check for existing -n option (to suppress newline) minusn='' bytes=`echo -n 123 2>/dev/null | wc -c | awk '{ printf("%s", $1); }'` if [ ".$bytes" = .3 ]; then minusn='-n' fi # determine terminal bold sequence term_bold='' term_norm='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[Bb]'`" != . ]; then case $TERM in # for the most important terminal types we directly know the sequences xterm|xterm*|vt220|vt220*) term_bold=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' /dev/null` term_norm=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' /dev/null` ;; vt100|vt100*|cygwin) term_bold=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' /dev/null` term_norm=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' /dev/null` ;; # for all others, we try to use a possibly existing `tput' or `tcout' utility * ) paths=`echo $PATH | sed -e 's/:/ /g'` for tool in tput tcout; do for dir in $paths; do if [ -r "$dir/$tool" ]; then for seq in bold md smso; do # 'smso' is last bold="`$dir/$tool $seq 2>/dev/null`" if [ ".$bold" != . ]; then term_bold="$bold" break fi done if [ ".$term_bold" != . ]; then for seq in sgr0 me rmso init reset; do # 'reset' is last norm="`$dir/$tool $seq 2>/dev/null`" if [ ".$norm" != . ]; then term_norm="$norm" break fi done fi break fi done if [ ".$term_bold" != . ] && [ ".$term_norm" != . ]; then break; fi done ;; esac if [ ".$term_bold" = . ] || [ ".$term_norm" = . ]; then echo "$msgprefix:Warning: unable to determine terminal sequence for bold mode" 1>&2 term_bold='' term_norm='' fi fi # determine user name username='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[uUgG]'`" != . ]; then username="`(id -un) 2>/dev/null`" if [ ".$username" = . ]; then str="`(id) 2>/dev/null`" if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then username=`echo $str | sed -e 's/^uid[ ]*=[ ]*[0-9]*(//' -e 's/).*$//'` fi if [ ".$username" = . ]; then username="$LOGNAME" if [ ".$username" = . ]; then username="$USER" if [ ".$username" = . ]; then username="`(whoami) 2>/dev/null |\ awk '{ printf("%s", $1); }'`" if [ ".$username" = . ]; then username="`(who am i) 2>/dev/null |\ awk '{ printf("%s", $1); }'`" if [ ".$username" = . ]; then username='unknown' fi fi fi fi fi fi fi # determine user id userid='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%U'`" != . ]; then userid="`(id -u) 2>/dev/null`" if [ ".$userid" = . ]; then userid="`(id -u ${username}) 2>/dev/null`" if [ ".$userid" = . ]; then str="`(id) 2>/dev/null`" if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then userid=`echo $str | sed -e 's/^uid[ ]*=[ ]*//' -e 's/(.*$//'` fi if [ ".$userid" = . ]; then userid=`(getent passwd ${username}) 2>/dev/null | \ sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$userid" = . ]; then userid=`grep "^${username}:" /etc/passwd 2>/dev/null | \ sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$userid" = . ]; then userid=`(ypmatch "${username}" passwd; nismatch "${username}" passwd) 2>/dev/null | \ sed -e 'q' | sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$userid" = . ]; then userid=`(nidump passwd . | grep "^${username}:") 2>/dev/null | \ sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$userid" = . ]; then userid='?' fi fi fi fi fi fi fi fi # determine (primary) group id groupid='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[gG]'`" != . ]; then groupid="`(id -g ${username}) 2>/dev/null`" if [ ".$groupid" = . ]; then str="`(id) 2>/dev/null`" if [ ".`echo $str | grep 'gid[ ]*=[ ]*[0-9]*('`" != . ]; then groupid=`echo $str | sed -e 's/^.*gid[ ]*=[ ]*//' -e 's/(.*$//'` fi if [ ".$groupid" = . ]; then groupid=`(getent passwd ${username}) 2>/dev/null | \ sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$groupid" = . ]; then groupid=`grep "^${username}:" /etc/passwd 2>/dev/null | \ sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$groupid" = . ]; then groupid=`(ypmatch "${username}" passwd; nismatch "${username}" passwd) 2>/dev/null | \ sed -e 'q' | sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$groupid" = . ]; then groupid=`(nidump passwd . | grep "^${username}:") 2>/dev/null | \ sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$groupid" = . ]; then groupid='?' fi fi fi fi fi fi fi # determine (primary) group name groupname='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%g'`" != . ]; then groupname="`(id -gn ${username}) 2>/dev/null`" if [ ".$groupname" = . ]; then str="`(id) 2>/dev/null`" if [ ".`echo $str | grep 'gid[ ]*=[ ]*[0-9]*('`" != . ]; then groupname=`echo $str | sed -e 's/^.*gid[ ]*=[ ]*[0-9]*(//' -e 's/).*$//'` fi if [ ".$groupname" = . ]; then groupname=`(getent group) 2>/dev/null | \ grep "^[^:]*:[^:]*:${groupid}:" | \ sed -e 's/:.*$//'` if [ ".$groupname" = . ]; then groupname=`grep "^[^:]*:[^:]*:${groupid}:" /etc/group 2>/dev/null | \ sed -e 's/:.*$//'` if [ ".$groupname" = . ]; then groupname=`(ypcat group; niscat group) 2>/dev/null | \ sed -e 'q' | grep "^[^:]*:[^:]*:${groupid}:" | \ sed -e 's/:.*$//'` if [ ".$groupname" = . ]; then groupname=`(nidump group .) 2>/dev/null | \ grep "^[^:]*:[^:]*:${groupid}:" | \ sed -e 's/:.*$//'` if [ ".$groupname" = . ]; then groupname='?' fi fi fi fi fi fi fi # determine host and domain name hostname='' domainname='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%h'`" != . ]; then hostname="`(uname -n) 2>/dev/null |\ awk '{ printf("%s", $1); }'`" if [ ".$hostname" = . ]; then hostname="`(hostname) 2>/dev/null |\ awk '{ printf("%s", $1); }'`" if [ ".$hostname" = . ]; then hostname='unknown' fi fi case $hostname in *.* ) domainname=".`echo $hostname | cut -d. -f2-`" hostname="`echo $hostname | cut -d. -f1`" ;; esac fi if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%d'`" != . ]; then if [ ".$domainname" = . ]; then if [ -f /etc/resolv.conf ]; then domainname="`grep '^[ ]*domain' /etc/resolv.conf | sed -e 'q' |\ sed -e 's/.*domain//' \ -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ -e 's/^\.//' -e 's/^/./' |\ awk '{ printf("%s", $1); }'`" if [ ".$domainname" = . ]; then domainname="`grep '^[ ]*search' /etc/resolv.conf | sed -e 'q' |\ sed -e 's/.*search//' \ -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ -e 's/ .*//' -e 's/ .*//' \ -e 's/^\.//' -e 's/^/./' |\ awk '{ printf("%s", $1); }'`" fi fi fi fi # determine current time time_day='' time_month='' time_year='' time_monthname='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[DMYm]'`" != . ]; then time_day=`date '+%d'` time_month=`date '+%m'` time_year=`date '+%Y' 2>/dev/null` if [ ".$time_year" = . ]; then time_year=`date '+%y'` case $time_year in [5-9][0-9]) time_year="19$time_year" ;; [0-4][0-9]) time_year="20$time_year" ;; esac fi case $time_month in 1|01) time_monthname='Jan' ;; 2|02) time_monthname='Feb' ;; 3|03) time_monthname='Mar' ;; 4|04) time_monthname='Apr' ;; 5|05) time_monthname='May' ;; 6|06) time_monthname='Jun' ;; 7|07) time_monthname='Jul' ;; 8|08) time_monthname='Aug' ;; 9|09) time_monthname='Sep' ;; 10) time_monthname='Oct' ;; 11) time_monthname='Nov' ;; 12) time_monthname='Dec' ;; esac fi # expand special ``%x'' constructs if [ ".$opt_e" = .yes ]; then text=`echo $seo "$text" |\ sed -e "s/%B/${term_bold}/g" \ -e "s/%b/${term_norm}/g" \ -e "s/%u/${username}/g" \ -e "s/%U/${userid}/g" \ -e "s/%g/${groupname}/g" \ -e "s/%G/${groupid}/g" \ -e "s/%h/${hostname}/g" \ -e "s/%d/${domainname}/g" \ -e "s/%D/${time_day}/g" \ -e "s/%M/${time_month}/g" \ -e "s/%Y/${time_year}/g" \ -e "s/%m/${time_monthname}/g" 2>/dev/null` fi # create output if [ .$opt_n = .no ]; then echo $seo "$text" else # the harder part: echo -n is best, because # awk may complain about some \xx sequences. if [ ".$minusn" != . ]; then echo $seo $minusn "$text" else echo dummy | awk '{ printf("%s", TEXT); }' TEXT="$text" fi fi shtool_exit 0 ;; mdate ) ## ## mdate -- Pretty-print modification time of a file or dir ## Copyright (c) 1995-1997 Free Software Foundation, Inc. ## Copyright (c) 1998-2008 Ralf S. Engelschall ## fod="$1" case "$opt_o" in [dmy][dmy][dmy] ) ;; * ) echo "$msgprefix:Error: invalid argument to option \`-o': $opt_o" 1>&2 shtool_exit 1 ;; esac if [ ! -r "$fod" ]; then echo "$msgprefix:Error: file or directory not found: $fod" 1>&2 shtool_exit 1 fi # GNU ls changes its time format in response to the TIME_STYLE # variable. Since we cannot assume "unset" works, revert this # variable to its documented default. if [ ".$TIME_STYLE" != . ]; then TIME_STYLE=posix-long-iso export TIME_STYLE fi # get the extended ls output of the file or directory. if /bin/ls -L /dev/null >/dev/null 2>&1; then set - x`/bin/ls -L -l -d $fod` else set - x`/bin/ls -l -d $fod` fi # The month is at least the fourth argument # (3 shifts here, the next inside the loop). shift; shift; shift # Find the month. Next argument is day, followed by the year or time. month="" while [ ".$month" = . ]; do shift case $1 in Jan) month=January; nummonth=1 ;; Feb) month=February; nummonth=2 ;; Mar) month=March; nummonth=3 ;; Apr) month=April; nummonth=4 ;; May) month=May; nummonth=5 ;; Jun) month=June; nummonth=6 ;; Jul) month=July; nummonth=7 ;; Aug) month=August; nummonth=8 ;; Sep) month=September; nummonth=9 ;; Oct) month=October; nummonth=10 ;; Nov) month=November; nummonth=11 ;; Dec) month=December; nummonth=12 ;; esac done day="$2" year="$3" # We finally have to deal with the problem that the "ls" output # gives either the time of the day or the year. case $year in *:*) this_year=`date '+%Y' 2>/dev/null` if [ ".$this_year" = . ]; then this_year=`date '+%y'` case $this_year in [5-9][0-9]) this_year="19$this_year" ;; [0-4][0-9]) this_year="20$this_year" ;; esac fi # for the following months of the last year the time notation # is usually also used for files modified in the last year. this_month=`date '+%m'` if (expr $nummonth \> $this_month) >/dev/null; then this_year=`expr $this_year - 1` fi year="$this_year" ;; esac # Optionally fill day and month with leeding zeros if [ ".$opt_z" = .yes ]; then case $day in [0-9][0-9] ) ;; [0-9] ) day="0$day" ;; esac case $nummonth in [0-9][0-9] ) ;; [0-9] ) nummonth="0$nummonth" ;; esac fi # Optionally use digits for month if [ ".$opt_d" = .yes ]; then month="$nummonth" fi # Optionally shorten the month name to three characters if [ ".$opt_s" = .yes ]; then month=`echo $month | cut -c1-3` fi # Output the resulting date string echo dummy | awk '{ for (i = 0; i < 3; i++) { now = substr(order, 1, 1); order = substr(order, 2); if (now == "d") out = day; else if (now == "m") out = month; else if (now == "y") out = year; if (i < 2) printf("%s%s", out, field); else printf("%s", out); } if (newline != "yes") printf("\n"); }' "day=$day" "month=$month" "year=$year" \ "field=$opt_f" "order=$opt_o" "newline=$opt_n" shtool_exit 0 ;; table ) ## ## table -- Pretty-print a field-separated list as a table ## Copyright (c) 1998-2008 Ralf S. Engelschall ## if [ $opt_c -gt 4 ]; then echo "$msgprefix:Error: Invalid number of colums (1..4 allowed only)" 1>&2 shtool_exit 1 fi case "x$opt_F" in x? ) ;; * ) echo "$msgprefix:Error: Invalid separator (one char allowed only)" 1>&2; shtool_exit 1 ;; esac # split the list into a table list=` IFS="$opt_F" for entry in $*; do if [ ".$entry" != . ]; then echo "$entry" fi done |\ awk " BEGIN { list = \"\"; n = 0; } { list = list \\$1; n = n + 1; if (n < $opt_c) { list = list \":\"; } if (n == $opt_c) { list = list \"\\n\"; n = 0; } } END { print list; } " ` # format table cells and make sure table # doesn't exceed maximum width OIFS="$IFS" IFS=' ' for entry in $list; do case $opt_c in 1 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s\\n\", \$1); }'" ;; 2 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s\\n\", \$1, \$2); }'" ;; 3 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3); }'" ;; 4 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3, \$4); }'" ;; esac done |\ awk "{ if (length(\$0) > $opt_s) { printf(\"%s\\n\", substr(\$0, 0, $opt_s-1)); } else { print \$0; } }" IFS="$OIFS" shtool_exit 0 ;; prop ) ## ## prop -- Display progress with a running propeller ## Copyright (c) 1998-2008 Ralf S. Engelschall ## perl='' for dir in `echo $PATH | sed -e 's/:/ /g'` .; do if [ -f "$dir/perl" ]; then perl="$dir/perl" break fi done if [ ".$perl" != . ]; then # Perl is preferred because writing to STDERR in # Perl really writes immediately as one would expect $perl -e ' @p = ("|","/","-","\\"); $i = 0; while () { printf(STDERR "\r%s...%s\b", $ARGV[0], $p[$i++]); $i = 0 if ($i > 3); } printf(STDERR "\r%s \n", $ARGV[0]); ' "$opt_p" else # But if Perl doesn't exists we use Awk even # some Awk's buffer even the /dev/stderr writing :-( awk ' BEGIN { split("|#/#-#\\", p, "#"); i = 1; } { printf("\r%s%c\b", prefix, p[i++]) > "/dev/stderr"; if (i > 4) { i = 1; } } END { printf("\r%s \n", prefix) > "/dev/stderr"; } ' "prefix=$opt_p" fi shtool_exit 0 ;; move ) ## ## move -- Move files with simultaneous substitution ## Copyright (c) 1999-2008 Ralf S. Engelschall ## src="$1" dst="$2" # consistency checks if [ ".$src" = . ] || [ ".$dst" = . ]; then echo "$msgprefix:Error: Invalid arguments" 1>&2 shtool_exit 1 fi if [ ".$src" = ".$dst" ]; then echo "$msgprefix:Error: Source and destination files are the same" 1>&2 shtool_exit 1 fi expsrc="$src" if [ ".$opt_e" = .yes ]; then expsrc="`echo $expsrc`" fi if [ ".$opt_e" = .yes ]; then if [ ".`echo "$src" | sed -e 's;^.*\\*.*$;;'`" = ".$src" ]; then echo "$msgprefix:Error: Source doesn't contain wildcard ('*'): $dst" 1>&2 shtool_exit 1 fi if [ ".`echo "$dst" | sed -e 's;^.*%[1-9].*$;;'`" = ".$dst" ]; then echo "$msgprefix:Error: Destination doesn't contain substitution ('%N'): $dst" 1>&2 shtool_exit 1 fi if [ ".$expsrc" = ".$src" ]; then echo "$msgprefix:Error: Sources not found or no asterisk : $src" 1>&2 shtool_exit 1 fi else if [ ! -r "$src" ]; then echo "$msgprefix:Error: Source not found: $src" 1>&2 shtool_exit 1 fi fi # determine substitution patterns if [ ".$opt_e" = .yes ]; then srcpat=`echo "$src" | sed -e 's/\\./\\\\./g' -e 's/;/\\;/g' -e 's;\\*;\\\\(.*\\\\);g'` dstpat=`echo "$dst" | sed -e 's;%\([1-9]\);\\\\\1;g'` fi # iterate over source(s) for onesrc in $expsrc; do if [ .$opt_e = .yes ]; then onedst=`echo $onesrc | sed -e "s;$srcpat;$dstpat;"` else onedst="$dst" fi errorstatus=0 if [ ".$opt_v" = .yes ]; then echo "$onesrc -> $onedst" fi if [ ".$opt_p" = .yes ]; then if [ -r $onedst ]; then if cmp -s $onesrc $onedst; then if [ ".$opt_t" = .yes ]; then echo "rm -f $onesrc" 1>&2 fi rm -f $onesrc || errorstatus=$? else if [ ".$opt_t" = .yes ]; then echo "mv -f $onesrc $onedst" 1>&2 fi mv -f $onesrc $onedst || errorstatus=$? fi else if [ ".$opt_t" = .yes ]; then echo "mv -f $onesrc $onedst" 1>&2 fi mv -f $onesrc $onedst || errorstatus=$? fi else if [ ".$opt_t" = .yes ]; then echo "mv -f $onesrc $onedst" 1>&2 fi mv -f $onesrc $onedst || errorstatus=$? fi if [ $errorstatus -ne 0 ]; then break; fi done shtool_exit $errorstatus ;; install ) ## ## install -- Install a program, script or datafile ## Copyright (c) 1997-2008 Ralf S. Engelschall ## # special case: "shtool install -d [...]" internally # maps to "shtool mkdir -f -p -m 755 [...]" if [ "$opt_d" = yes ]; then cmd="$0 mkdir -f -p -m 755" if [ ".$opt_o" != . ]; then cmd="$cmd -o '$opt_o'" fi if [ ".$opt_g" != . ]; then cmd="$cmd -g '$opt_g'" fi if [ ".$opt_v" = .yes ]; then cmd="$cmd -v" fi if [ ".$opt_t" = .yes ]; then cmd="$cmd -t" fi for dir in "$@"; do eval "$cmd $dir" || shtool_exit $? done shtool_exit 0 fi # determine source(s) and destination argc=$# srcs="" while [ $# -gt 1 ]; do srcs="$srcs $1" shift done dstpath="$1" # type check for destination dstisdir=0 if [ -d $dstpath ]; then dstpath=`echo "$dstpath" | sed -e 's:/$::'` dstisdir=1 fi # consistency check for destination if [ $argc -gt 2 ] && [ $dstisdir = 0 ]; then echo "$msgprefix:Error: multiple sources require destination to be directory" 1>&2 shtool_exit 1 fi # iterate over all source(s) for src in $srcs; do dst=$dstpath # if destination is a directory, append the input filename if [ $dstisdir = 1 ]; then dstfile=`echo "$src" | sed -e 's;.*/\([^/]*\)$;\1;'` dst="$dst/$dstfile" fi # check for correct arguments if [ ".$src" = ".$dst" ]; then echo "$msgprefix:Warning: source and destination are the same - skipped" 1>&2 continue fi if [ -d "$src" ]; then echo "$msgprefix:Warning: source \`$src' is a directory - skipped" 1>&2 continue fi # make a temp file name in the destination directory dsttmp=`echo $dst |\ sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;' \ -e "s;\$;/#INST@$$#;"` # verbosity if [ ".$opt_v" = .yes ]; then echo "$src -> $dst" 1>&2 fi # copy or move the file name to the temp name # (because we might be not allowed to change the source) if [ ".$opt_C" = .yes ]; then opt_c=yes fi if [ ".$opt_c" = .yes ]; then if [ ".$opt_t" = .yes ]; then echo "cp $src $dsttmp" 1>&2 fi cp "$src" "$dsttmp" || shtool_exit $? else if [ ".$opt_t" = .yes ]; then echo "mv $src $dsttmp" 1>&2 fi mv "$src" "$dsttmp" || shtool_exit $? fi # adjust the target file if [ ".$opt_e" != . ]; then sed='sed' OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_e; IFS="$OIFS" for e do sed="$sed -e '$e'" done cp "$dsttmp" "$dsttmp.old" chmod u+w $dsttmp eval "$sed <$dsttmp.old >$dsttmp" || shtool_exit $? rm -f $dsttmp.old fi if [ ".$opt_s" = .yes ]; then if [ ".$opt_t" = .yes ]; then echo "strip $dsttmp" 1>&2 fi strip $dsttmp || shtool_exit $? fi if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o $dsttmp" 1>&2 fi chown $opt_o $dsttmp || shtool_exit $? fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp $opt_g $dsttmp" 1>&2 fi chgrp $opt_g $dsttmp || shtool_exit $? fi if [ ".$opt_m" != ".-" ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m $dsttmp" 1>&2 fi chmod $opt_m $dsttmp || shtool_exit $? fi # determine whether to do a quick install # (has to be done _after_ the strip was already done) quick=no if [ ".$opt_C" = .yes ]; then if [ -r $dst ]; then if cmp -s "$src" "$dst"; then quick=yes fi fi fi # finally, install the file to the real destination if [ $quick = yes ]; then if [ ".$opt_t" = .yes ]; then echo "rm -f $dsttmp" 1>&2 fi rm -f $dsttmp else if [ ".$opt_t" = .yes ]; then echo "rm -f $dst && mv $dsttmp $dst" 1>&2 fi rm -f $dst && mv $dsttmp $dst fi done shtool_exit 0 ;; mkdir ) ## ## mkdir -- Make one or more directories ## Copyright (c) 1996-2008 Ralf S. Engelschall ## errstatus=0 for p in ${1+"$@"}; do # if the directory already exists... if [ -d "$p" ]; then if [ ".$opt_f" = .no ] && [ ".$opt_p" = .no ]; then echo "$msgprefix:Error: directory already exists: $p" 1>&2 errstatus=1 break else continue fi fi # if the directory has to be created... if [ ".$opt_p" = .no ]; then if [ ".$opt_t" = .yes ]; then echo "mkdir $p" 1>&2 fi mkdir $p || errstatus=$? if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o $p" 1>&2 fi chown $opt_o $p || errstatus=$? fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp $opt_g $p" 1>&2 fi chgrp $opt_g $p || errstatus=$? fi if [ ".$opt_m" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m $p" 1>&2 fi chmod $opt_m $p || errstatus=$? fi else # the smart situation set fnord `echo ":$p" |\ sed -e 's/^:\//%/' \ -e 's/^://' \ -e 's/\// /g' \ -e 's/^%/\//'` shift pathcomp='' for d in ${1+"$@"}; do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp="./$pathcomp" ;; esac if [ ! -d "$pathcomp" ]; then if [ ".$opt_t" = .yes ]; then echo "mkdir $pathcomp" 1>&2 fi mkdir $pathcomp || errstatus=$? if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o $pathcomp" 1>&2 fi chown $opt_o $pathcomp || errstatus=$? fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp $opt_g $pathcomp" 1>&2 fi chgrp $opt_g $pathcomp || errstatus=$? fi if [ ".$opt_m" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m $pathcomp" 1>&2 fi chmod $opt_m $pathcomp || errstatus=$? fi fi pathcomp="$pathcomp/" done fi done shtool_exit $errstatus ;; mkln ) ## ## mkln -- Make link with calculation of relative paths ## Copyright (c) 1998-2008 Ralf S. Engelschall ## # determine source(s) and destination args=$# srcs="" while [ $# -gt 1 ]; do srcs="$srcs $1" shift done dst="$1" if [ ! -d $dst ]; then if [ $args -gt 2 ]; then echo "$msgprefix:Error: multiple sources not allowed when target isn't a directory" 1>&2 shtool_exit 1 fi fi # determine link options lnopt="" if [ ".$opt_f" = .yes ]; then lnopt="$lnopt -f" fi if [ ".$opt_s" = .yes ]; then lnopt="$lnopt -s" fi # iterate over sources for src in $srcs; do # determine if one of the paths is an absolute path, # because then we _have_ to use an absolute symlink oneisabs=0 srcisabs=0 dstisabs=0 case $src in /* ) oneisabs=1; srcisabs=1 ;; esac case $dst in /* ) oneisabs=1; dstisabs=1 ;; esac # split source and destination into dir and base name if [ -d $src ]; then srcdir=`echo $src | sed -e 's;/*$;;'` srcbase="" else srcdir=`echo $src | sed -e 's;^[^/]*$;;' -e 's;^\(.*/\)[^/]*$;\1;' -e 's;\(.\)/$;\1;'` srcbase=`echo $src | sed -e 's;.*/\([^/]*\)$;\1;'` fi if [ -d $dst ]; then dstdir=`echo $dst | sed -e 's;/*$;;'` dstbase="" else dstdir=`echo $dst | sed -e 's;^[^/]*$;;' -e 's;^\(.*/\)[^/]*$;\1;' -e 's;\(.\)/$;\1;'` dstbase=`echo $dst | sed -e 's;.*/\([^/]*\)$;\1;'` fi # consistency check if [ ".$dstdir" != . ]; then if [ ! -d $dstdir ]; then echo "$msgprefix:Error: destination directory not found: $dstdir" 1>&2 shtool_exit 1 fi fi # make sure the source is reachable from the destination if [ $dstisabs = 1 ]; then if [ $srcisabs = 0 ]; then if [ ".$srcdir" = . ]; then srcdir="`pwd | sed -e 's;/*$;;'`" srcisabs=1 oneisabs=1 elif [ -d $srcdir ]; then srcdir="`cd $srcdir; pwd | sed -e 's;/*$;;'`" srcisabs=1 oneisabs=1 fi fi fi # split away a common prefix prefix="" if [ ".$srcdir" = ".$dstdir" ] && [ ".$srcdir" != . ]; then prefix="$srcdir/" srcdir="" dstdir="" else while [ ".$srcdir" != . ] && [ ".$dstdir" != . ]; do presrc=`echo $srcdir | sed -e 's;^\([^/]*\)/.*;\1;'` predst=`echo $dstdir | sed -e 's;^\([^/]*\)/.*;\1;'` if [ ".$presrc" != ".$predst" ]; then break fi prefix="$prefix$presrc/" srcdir=`echo $srcdir | sed -e 's;^[^/]*/*;;'` dstdir=`echo $dstdir | sed -e 's;^[^/]*/*;;'` done fi # destination prefix is just the common prefix dstpre="$prefix" # determine source prefix which is the reverse directory # step-up corresponding to the destination directory srcpre="" allow_relative_srcpre=no if [ ".$prefix" != . ] && [ ".$prefix" != ./ ]; then allow_relative_srcpre=yes fi if [ $oneisabs = 0 ]; then allow_relative_srcpre=yes fi if [ ".$opt_s" != .yes ]; then allow_relative_srcpre=no fi if [ ".$allow_relative_srcpre" = .yes ]; then pl="$dstdir/" OIFS="$IFS"; IFS='/' for pe in $pl; do [ ".$pe" = . ] && continue [ ".$pe" = .. ] && continue srcpre="../$srcpre" done IFS="$OIFS" else if [ $srcisabs = 1 ]; then srcpre="$prefix" fi fi # determine destination symlink name if [ ".$dstbase" = . ]; then if [ ".$srcbase" != . ]; then dstbase="$srcbase" else dstbase=`echo "$prefix$srcdir" | sed -e 's;/*$;;' -e 's;.*/\([^/]*\)$;\1;'` fi fi # now finalize source and destination directory paths srcdir=`echo $srcdir | sed -e 's;\([^/]\)$;\1/;'` dstdir=`echo $dstdir | sed -e 's;\([^/]\)$;\1/;'` # run the final link command if [ ".$opt_t" = .yes ]; then echo "ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase" fi eval ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase done shtool_exit 0 ;; mkshadow ) ## ## mkshadow -- Make a shadow tree through symbolic links ## Copyright (c) 1998-2008 Ralf S. Engelschall ## # source and destination directory src=`echo "$1" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'` dst=`echo "$2" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'` # check whether source exists if [ ! -d $src ]; then echo "$msgprefix:Error: source directory not found: \`$src'" 1>&2 shtool_exit 1 fi # determine if one of the paths is an absolute path, # because then we have to use an absolute symlink oneisabs=0 case $src in /* ) oneisabs=1 ;; esac case $dst in /* ) oneisabs=1 ;; esac # determine reverse directory for destination directory dstrevdir='' if [ $oneisabs = 0 ]; then # derive reverse path from forward path pwd=`pwd` OIFS="$IFS"; IFS='/' for pe in $dst; do if [ "x$pe" = "x.." ]; then OIFS2="$IFS"; IFS="$DIFS" eval `echo "$pwd" |\ sed -e 's:\([^/]*\)$:; dir="\1":' \ -e 's:^\(.*\)/[^/]*;:pwd="\1";:'\ -e 's:^;:pwd="";:'` dstrevdir="$dir/$dstrevdir" IFS="$OIFS2" else dstrevdir="../$dstrevdir" fi done IFS="$OIFS" else src="`cd $src; pwd`"; fi # create directory tree at destination if [ ! -d $dst ]; then if [ ".$opt_t" = .yes ]; then echo "mkdir $dst" 1>&2 fi mkdir $dst fi if [ ".$opt_a" = .yes ]; then DIRS=`cd $src; find . -type d -print |\ sed -e '/^\.$/d' -e 's:^\./::'` else DIRS=`cd $src; find . -type d -print |\ sed -e '/\/CVS/d' -e '/^\.$/d' -e 's:^\./::'` fi for dir in $DIRS; do if [ ".$opt_t" = .yes ]; then echo "mkdir $dst/$dir" 1>&2 fi mkdir $dst/$dir done # fill directory tree with symlinks to files if [ ".$opt_a" = .yes ]; then FILES="`cd $src; find . -depth -print |\ sed -e 's/^\.\///'`" else FILES="`cd $src; find . -depth -print |\ sed -e '/\.o$/d' -e '/\.a$/d' -e '/\.so$/d' \ -e '/\.cvsignore$/d' -e '/\/CVS/d' \ -e '/\/\.#/d' -e '/\.orig$/d' \ -e 's/^\.\///'`" fi for file in $FILES; do # don't use `-type f' above for find because of symlinks if [ -d "$src/$file" ]; then continue fi basename=`echo $file | sed -e 's:^.*/::'` dir=`echo $file | sed -e 's:[^/]*$::' -e 's:/$::' -e 's:$:/:' -e 's:^/$::'` from=`echo "$src/$file" | sed -e 's/^\.\///'` to="$dst/$dir$basename" if [ $oneisabs = 0 ]; then if [ ".$dir" != . ]; then subdir=`echo $dir | sed -e 's:/$::'` # derive reverse path from forward path revdir='' OIFS="$IFS"; IFS='/' for pe in $subdir; do revdir="../$revdir" done IFS="$OIFS" # finalize from from="$revdir$from" fi from="$dstrevdir$from" fi if [ ".$opt_v" = .yes ]; then echo " $to" 1>&2 fi if [ ".$opt_t" = .yes ]; then echo "ln -s $from $to" 1>&2 fi ln -s $from $to done shtool_exit 0 ;; fixperm ) ## ## fixperm -- Fix file permissions inside a source tree ## Copyright (c) 1996-2008 Ralf S. Engelschall ## paths="$*" # check whether the test command supports the -x option if [ -x /bin/sh ] 2>/dev/null; then minusx="-x" else minusx="-r" fi # iterate over paths for p in $paths; do for file in `find $p -depth -print`; do if [ -f $file ]; then if [ $minusx $file ]; then if [ ".$opt_v" = .yes ]; then echo "-rwxr-xr-x $file" 2>&1 fi if [ ".$opt_t" = .yes ]; then echo "chmod 755 $file" 2>&1 fi chmod 755 $file else if [ ".$opt_v" = .yes ]; then echo "-rw-r--r-- $file" 2>&1 fi if [ ".$opt_t" = .yes ]; then echo "chmod 644 $file" 2>&1 fi chmod 644 $file fi continue fi if [ -d $file ]; then if [ ".$opt_v" = .yes ]; then echo "drwxr-xr-x $file" 2>&1 fi if [ ".$opt_t" = .yes ]; then echo "chmod 755 $file" 2>&1 fi chmod 755 $file continue fi if [ ".$opt_v" = .yes ]; then echo "?????????? $file" 2>&1 fi done done shtool_exit 0 ;; rotate ) ## ## rotate -- Logfile rotation ## Copyright (c) 2001-2008 Ralf S. Engelschall ## # make sure we have at least one file to rotate if [ ".$opt_n" = .0 ]; then echo "$msgprefix:Error: invalid argument \`$opt_n' to option -n." 1>&2 shtool_exit 1 fi # canonicalize -s option argument if [ ".$opt_s" != . ]; then if [ ".`expr $opt_s : '[0-9]*$'`" != .0 ]; then : elif [ ".`expr $opt_s : '[0-9]*[Kk]$'`" != .0 ]; then opt_s=`expr $opt_s : '\([0-9]*\)[Kk]$'` opt_s=`expr $opt_s \* 1024` elif [ ".`expr $opt_s : '[0-9]*[Mm]$'`" != .0 ]; then opt_s=`expr $opt_s : '\([0-9]*\)[Mm]$'` opt_s=`expr $opt_s \* 1048576` # 1024*1024 elif [ ".`expr $opt_s : '[0-9]*[Gg]$'`" != .0 ]; then opt_s=`expr $opt_s : '\([0-9]*\)[Gg]$'` opt_s=`expr $opt_s \* 1073741824` # 1024*1024*1024 else echo "$msgprefix:Error: invalid argument \`$opt_s' to option -s." 1>&2 shtool_exit 1 fi fi # option -d/-z consistency if [ ".$opt_d" = .yes ] && [ ".$opt_z" = . ]; then echo "$msgprefix:Error: option -d requires option -z." 1>&2 shtool_exit 1 fi # make sure target directory exists if [ ".$opt_a" != . ]; then if [ ! -d $opt_a ]; then if [ ".$opt_f" = .no ]; then echo "$msgprefix:Error: archive directory \`$opt_a' does not exist." 1>&2 shtool_exit 1 fi mkdir $opt_a || shtool_exit $? chmod 755 $opt_a fi if [ ! -w $opt_a ]; then echo "$msgprefix:Error: archive directory \`$opt_a' not writable." 1>&2 shtool_exit 1 fi fi # determine compression approach if [ ".$opt_z" != . ]; then comp_lvl="$opt_z" comp_prg="" case $comp_lvl in *:* ) eval `echo $comp_lvl |\ sed -e 's%^\(.*\):\(.*\)$%comp_prg="\1"; comp_lvl="\2"%'` ;; esac # compression level consistency case $comp_lvl in [0-9] ) ;; * ) echo "$msgprefix:Error: invalid compression level \`$comp_lvl'" 1>&2 shtool_exit 1 ;; esac # determine a suitable compression tool if [ ".$comp_prg" = . ]; then # check whether the test command supports the -x option if [ -x /bin/sh ] 2>/dev/null; then minusx="-x" else minusx="-r" fi # search for tools in $PATH paths="`echo $PATH |\ sed -e 's%/*:%:%g' -e 's%/*$%%' \ -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \ -e 's/:/ /g'`" for prg in bzip2 gzip compress; do for path in $paths; do if [ $minusx "$path/$prg" ] && [ ! -d "$path/$prg" ]; then comp_prg="$prg" break fi done if [ ".$comp_prg" != . ]; then break fi done if [ ".$comp_prg" = . ]; then echo "$msgprefix:Error: no suitable compression tool found in \$PATH" 1>&2 shtool_exit 1 fi fi # determine standard compression extension # and make sure it is a known tool case $comp_prg in */bzip2 | bzip2 ) comp_ext="bz2" comp_lvl="-$comp_lvl" ;; */gzip | gzip ) comp_ext="gz" comp_lvl="-$comp_lvl" ;; */compress | compress ) comp_ext="Z"; comp_lvl="" ;; * ) echo "$msgprefix:Error: tool \`$comp_prg' is not a known compression tool" 1>&2 shtool_exit 1 ;; esac comp_suf=".$comp_ext" fi # iterate over all given logfile arguments for file in $*; do # make sure the logfile exists if [ ! -f $file ]; then if [ ".$opt_f" = .yes ]; then continue fi echo "$msgprefix:Error: logfile \`$file' not found" 1>&2 shtool_exit 1 fi # determine log directory (where original logfile is placed) ldir="." case $file in */* ) eval `echo $file | sed -e 's%^\(.*\)/\([^/]*\)$%ldir="\1"; file="\2";%'` ;; esac # determine archive directory (where rotated logfiles are placed) adir="$ldir" if [ ".$opt_a" != . ]; then case "$opt_a" in /* | ./* ) adir="$opt_a" ;; * ) adir="$ldir/$opt_a" ;; esac fi # optionally take logfile size into account if [ ".$opt_s" != . ]; then # determine size of logfile set -- `env -i /bin/ls -l "$ldir/$file" | sed -e "s;$ldir/$file;;" |\ sed -e 's; -> .*$;;' -e 's;[ ][ ]*; ;g'` n=`expr $# - 3` eval "size=\`echo \${$n}\`" # skip logfile if size is still too small if [ $size -lt $opt_s ]; then if [ ".$opt_v" = .yes ]; then echo "$ldir/$file: still too small in size -- skipping" fi continue fi fi # verbosity if [ ".$opt_v" = .yes ]; then echo "rotating $ldir/$file" fi # execute prolog if [ ".$opt_P" != . ]; then if [ ".$opt_t" = .yes ]; then echo "$opt_P" fi eval $opt_P [ $? -ne 0 ] && shtool_exit $? fi # kick away out-rotated logfile n=`expr $opt_n - 1` n=`echo dummy | awk "{ printf(\"%0${opt_p}d\", n); }" n=$n` if [ -f "${adir}/${file}.${n}${comp_suf}" ]; then # optionally migrate away the out-rotated logfile if [ ".$opt_M" != . ]; then if [ ".$opt_t" = .yes ]; then echo "$opt_M ${adir}/${file}.${n}${comp_suf}" fi eval "$opt_M ${adir}/${file}.${n}${comp_suf}" [ $? -ne 0 ] && shtool_exit $? fi # finally get rid of the out-rotated logfile if [ ".$opt_t" = .yes ]; then echo "rm -f ${adir}/${file}.${n}${comp_suf}" fi rm -f ${adir}/${file}.${n}${comp_suf} || shtool_exit $? fi # rotate already archived logfiles while [ $n -gt 0 ]; do m=$n n=`expr $n - 1` n=`echo dummy | awk "{ printf(\"%0${opt_p}d\", n); }" n=$n` if [ $n -eq 0 ] && [ ".$opt_d" = .yes ]; then # special case: first rotation file under delayed compression situation if [ ! -f "${adir}/${file}.${n}" ]; then continue fi # compress file (delayed) if [ ".$opt_b" = .yes ]; then if [ ".$opt_t" = .yes ]; then echo "mv ${adir}/${file}.${n} ${adir}/${file}.${m}" fi mv ${adir}/${file}.${n} ${adir}/${file}.${m} || shtool_exit $? if [ ".$opt_t" = .yes ]; then echo "(${comp_prg} ${comp_lvl} <${adir}/${file}.${m} >${adir}/${file}.${m}${comp_suf}; rm -f ${adir}/${file}.${m}) &" fi ( ${comp_prg} ${comp_lvl} \ <${adir}/${file}.${m} \ >${adir}/${file}.${m}${comp_suf} || shtool_exit $? rm -f ${adir}/${file}.${m} || shtool_exit $? ) /dev/null 2>&1 & else if [ ".$opt_t" = .yes ]; then echo "${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${m}${comp_suf}" fi ${comp_prg} ${comp_lvl} \ <${adir}/${file}.${n} \ >${adir}/${file}.${m}${comp_suf} || shtool_exit $? if [ ".$opt_t" = .yes ]; then echo "rm -f ${adir}/${file}.${n}" fi rm -f ${adir}/${file}.${n} || shtool_exit $? fi # fix file attributes if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o ${adir}/${file}.${m}${comp_suf}" fi chown $opt_o ${adir}/${file}.${m}${comp_suf} || shtool_exit $? fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp $opt_g ${adir}/${file}.${m}${comp_suf}" fi chgrp $opt_g ${adir}/${file}.${m}${comp_suf} || shtool_exit $? fi if [ ".$opt_m" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m ${adir}/${file}.${m}${comp_suf}" fi chmod $opt_m ${adir}/${file}.${m}${comp_suf} || shtool_exit $? fi else # standard case: second and following rotation file if [ ! -f "${adir}/${file}.${n}${comp_suf}" ]; then continue fi if [ ".$opt_t" = .yes ]; then echo "mv ${adir}/${file}.${n}${comp_suf} ${adir}/${file}.${m}${comp_suf}" fi mv ${adir}/${file}.${n}${comp_suf} ${adir}/${file}.${m}${comp_suf} || shtool_exit $? fi done # move away current logfile if [ ".$opt_c" = .yes ]; then # approach: copy[+truncate] if [ ".$opt_t" = .yes ]; then echo "cp -p ${ldir}/${file} ${adir}/${file}.${n}" fi cp -p ${ldir}/${file} ${adir}/${file}.${n} || shtool_exit $? if [ ".$opt_r" = .no ]; then if [ ".$opt_t" = .yes ]; then echo "cp /dev/null ${ldir}/${file}" fi cp /dev/null ${ldir}/${file} || shtool_exit $? fi else # approach: move[+touch] if [ ".$opt_t" = .yes ]; then echo "mv ${ldir}/${file} ${adir}/${file}.${n}" fi mv ${ldir}/${file} ${adir}/${file}.${n} || shtool_exit $? if [ ".$opt_r" = .no ]; then if [ ".$opt_t" = .yes ]; then echo "touch ${ldir}/${file}" fi touch ${ldir}/${file} || shtool_exit $? # fix file attributes if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o ${ldir}/${file}" fi chown $opt_o ${ldir}/${file} || shtool_exit $? fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp $opt_g ${ldir}/${file}" fi chgrp $opt_g ${ldir}/${file} || shtool_exit $? fi if [ ".$opt_m" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m ${ldir}/${file}" fi chmod $opt_m ${ldir}/${file} || shtool_exit $? fi fi fi # regular compression step if [ ".$opt_z" != . ] && [ ".$opt_d" = .no ]; then # compress file if [ ".$opt_b" = .yes ]; then if [ ".$opt_t" = .yes ]; then echo "(${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${n}${comp_suf}; rm -f ${adir}/${file}.${n}) &" fi ( ${comp_prg} ${comp_lvl} \ <${adir}/${file}.${n} \ >${adir}/${file}.${n}${comp_suf} || shtool_exit $? rm -f ${adir}/${file}.${n} || shtool_exit $? ) /dev/null 2>&1 & else if [ ".$opt_t" = .yes ]; then echo "${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${n}${comp_suf}" fi ${comp_prg} ${comp_lvl} \ <${adir}/${file}.${n} \ >${adir}/${file}.${n}${comp_suf} || shtool_exit $? if [ ".$opt_t" = .yes ]; then echo "rm -f ${opt_a}${file}.${n}" fi rm -f ${adir}/${file}.${n} || shtool_exit $? fi # fix file attributes if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o ${adir}/${file}.${n}${comp_suf}" fi chown $opt_o ${adir}/${file}.${n}${comp_suf} || shtool_exit $? fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp $opt_g ${adir}/${file}.${n}${comp_suf}" fi chgrp $opt_g ${adir}/${file}.${n}${comp_suf} || shtool_exit $? fi if [ ".$opt_m" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m ${adir}/${file}.${n}${comp_suf}" fi chmod $opt_m ${adir}/${file}.${n}${comp_suf} || shtool_exit $? fi fi # execute epilog if [ ".$opt_E" != . ]; then if [ ".$opt_t" = .yes ]; then echo "$opt_E" fi eval $opt_E [ $? -ne 0 ] && shtool_exit $? fi done shtool_exit 0 ;; tarball ) ## ## tarball -- Roll distribution tarballs ## Copyright (c) 1999-2008 Ralf S. Engelschall ## srcs="$*" # check whether the test command supports the -x option if [ -x /bin/sh ] 2>/dev/null; then minusx="-x" else minusx="-r" fi # find the tools paths="`echo $PATH |\ sed -e 's%/*:%:%g' -e 's%/*$%%' \ -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \ -e 's/:/ /g'`" for spec in find:gfind,find tar:gtar,tar tardy:tardy,tarcust; do prg=`echo $spec | sed -e 's/:.*$//'` tools=`echo $spec | sed -e 's/^.*://'` eval "prg_${prg}=''" # iterate over tools for tool in `echo $tools | sed -e 's/,/ /g'`; do # iterate over paths for path in $paths; do if [ $minusx "$path/$tool" ] && [ ! -d "$path/$tool" ]; then eval "prg_${prg}=\"$path/$tool\"" break fi done eval "val=\$prg_${prg}" if [ ".$val" != . ]; then break fi done done # expand source paths exclude='' for pat in `echo $opt_e | sed 's/,/ /g'`; do exclude="$exclude | grep -v '$pat'" done if [ ".$opt_t" = .yes ]; then echo "cp /dev/null $tmpfile.lst" 1>&2 fi cp /dev/null $tmpfile.lst for src in $srcs; do if [ -d $src ]; then if [ ".$opt_t" = .yes ]; then echo "(cd $src && $prg_find . -type f -depth -print) | sed -e 's:^\\.\$::' -e 's:^\\./::' | cat $exclude >>$tmpfile.lst" 1>&2 fi (cd $src && $prg_find . -type f -depth -print) |\ sed -e 's:^\.$::' -e 's:^\./::' | eval cat $exclude >>$tmpfile.lst else if [ ".$opt_t" = .yes ]; then echo "echo $src >>$tmpfile.lst" 1>&2 fi echo $src >>$tmpfile.lst fi done sort <$tmpfile.lst >$tmpfile.lst.n mv $tmpfile.lst.n $tmpfile.lst if [ ".$opt_v" = .yes ]; then cat $tmpfile.lst | sed -e 's/^/ /' 1>&2 fi # determine tarball file and directory name if [ ".$opt_o" != . ]; then tarfile="$opt_o" if [ ".$opt_d" != . ]; then tarname="$opt_d" else tarname=`echo $tarfile | sed -e 's/\.tar.*$//' -e 's;.*/\([^/]*\)$;\1;'` fi else if [ ".$opt_d" != . ]; then tarname="$opt_d" elif [ -d "$from" ]; then tarname=`echo $from | sed -e 's;.*/\([^/]*\)$;\1;'` else tarname="out" fi tarfile="$tarname.tar" fi # roll the tarball compress='' if [ ".$opt_c" != . ]; then compress="| $opt_c" fi if [ ".$prg_tardy" != . ]; then # the elegant hackers way tardy_opt="--prefix=$tarname" tardy_opt="$tardy_opt --user_number=0 --group_number=0" # security! if [ ".$opt_u" != . ]; then tardy_opt="$tardy_opt --user_name=$opt_u" fi if [ ".$opt_g" != . ]; then tardy_opt="$tardy_opt --group_name=$opt_g" fi if [ ".$opt_t" = .yes ]; then echo "cat $tmpfile.lst | xargs $prg_tar cf - | $prg_tardy $tardy_opt | cat $compress >$tmpfile.out" 1>&2 fi cat $tmpfile.lst |\ xargs $prg_tar cf - |\ $prg_tardy $tardy_opt |\ eval cat $compress >$tmpfile.out if [ ".$opt_t" = .yes ]; then echo "cp $tmpfile.out $tarfile" 1>&2 fi cp $tmpfile.out $tarfile else # the portable standard way if [ ".$opt_t" = .yes ]; then echo "mkdir $tmpdir/$tarname" 1>&2 fi mkdir $tmpdir/$tarname || shtool_exit 1 if [ ".$opt_t" = .yes ]; then echo "cat $tmpfile.lst | xargs $prg_tar cf - | (cd $tmpdir/$tarname && $prg_tar xf -)" 1>&2 fi cat $tmpfile.lst |\ xargs $prg_tar cf - |\ (cd $tmpdir/$tarname && $prg_tar xf -) if [ ".$opt_u" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown -R $opt_u $tmpdir/$tarname >/dev/null 2>&1" 2>&1 fi chown -R $opt_u $tmpdir/$tarname >/dev/null 2>&1 ||\ echo "$msgprefix:Warning: cannot set user name \`$opt_u' (would require root privileges)" fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp -R $opt_g $tmpdir/$tarname >/dev/null 2>&1" 2>&1 fi chgrp -R $opt_g $tmpdir/$tarname >/dev/null 2>&1 ||\ echo "$msgprefix:Warning: cannot set group name \`$opt_g' (would require root privileges)" fi if [ ".$opt_t" = .yes ]; then echo "(cd $tmpdir && $prg_find $tarname -type f -depth -print | sort | xargs $prg_tar cf -) | cat $compress >$tmpfile.out" 1>&2 fi (cd $tmpdir && $prg_find $tarname -type f -depth -print | sort | xargs $prg_tar cf -) |\ eval cat $compress >$tmpfile.out if [ ".$opt_t" = .yes ]; then echo "cp $tmpfile.out $tarfile" 1>&2 fi cp $tmpfile.out $tarfile if [ ".$opt_t" = .yes ]; then echo "rm -rf $tmpdir/$tarname" 1>&2 fi rm -rf $tmpdir/$tarname fi # cleanup if [ ".$opt_t" = .yes ]; then echo "rm -f $tmpfile.lst $tmpfile.out" 1>&2 fi rm -f $tmpfile.lst $tmpfile.out shtool_exit 0 ;; subst ) ## ## subst -- Apply sed(1) substitution operations ## Copyright (c) 2001-2008 Ralf S. Engelschall ## # remember optional list of file(s) files="$*" files_num="$#" # parameter consistency check if [ $# -eq 0 ] && [ ".$opt_b" != . ]; then echo "$msgprefix:Error: option -b cannot be applied to stdin" 1>&2 shtool_exit 1 fi if [ $# -eq 0 ] && [ ".$opt_s" = .yes ]; then echo "$msgprefix:Error: option -s cannot be applied to stdin" 1>&2 shtool_exit 1 fi # build underlying sed(1) command sedcmd='sed' if [ ".$opt_e" != . ]; then OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_e; IFS="$OIFS" for e do sedcmd="$sedcmd -e '$e'" done elif [ ".$opt_f" != . ]; then if [ ! -f $opt_f ]; then echo "$msgprefix:Error: command file \`$opt_f' not found or not a regular file" 1>&2 shtool_exit 1 fi sedcmd="$sedcmd -f '$opt_f'" else echo "$msgprefix:Error: either -e option(s) or -f option required" 1>&2 shtool_exit 1 fi # determine extension for original file orig=".orig" if [ ".$opt_b" != . ]; then orig="$opt_b" fi # apply sed(1) operation(s) if [ ".$files" != . ]; then # apply operation(s) to files substdone=no for file in $files; do test ".$file" = . && continue if [ ! -f $file ]; then echo "$msgprefix:Warning: file \`$file' not found or not a regular file" 1>&2 continue fi # handle interactive mode if [ ".$opt_i" = .yes ]; then eval "$sedcmd <$file >$file.new" skip=no if cmp $file $file.new >/dev/null 2>&1; then rm -f $file.new skip=yes else (diff -U1 $file $file.new >$tmpfile) 2>/dev/null if [ ".`cat $tmpfile`" = . ]; then (diff -C1 $file $file.new >$tmpfile) 2>/dev/null if [ ".`cat $tmpfile`" = . ]; then echo "$msgprefix:Warning: unable to show difference for file \`$file'" 1>&2 cp /dev/null $tmpfile fi fi rm -f $file.new cat $tmpfile echo dummy | awk '{ printf("%s", TEXT); }' TEXT=">>> Apply [Y/n]: " read input if [ ".$input" != .Y ] &&\ [ ".$input" != .y ] &&\ [ ".$input" != . ]; then skip=yes fi fi if [ ".$skip" = .yes ]; then if [ ".$opt_v" = .yes ]; then echo "file \`$file' -- skipped" 1>&2 fi continue fi fi # apply sed(1) operation(s) if [ ".$opt_v" = .yes ]; then echo "patching \`$file'" 1>&2 fi if [ ".$opt_t" = .yes ]; then echo "\$ cp -p $file $file$orig" echo "\$ chmod u+w $file" echo "\$ $sedcmd <$file$orig >$file" fi if [ ".$opt_n" = .no ]; then cp -p $file $file$orig chmod u+w $file >/dev/null 2>&1 || true eval "$sedcmd <$file$orig >$file" fi # optionally fix timestamp if [ ".$opt_s" = .yes ]; then if [ ".$opt_t" = .yes ]; then echo "\$ touch -r $file$orig $file" fi if [ ".$opt_n" = .no ]; then touch -r $file$orig $file fi fi # optionally check whether any content change actually occurred if [ ".$opt_q" = .no ]; then if cmp $file$orig $file >/dev/null 2>&1; then if [ ".$opt_w" = .yes ]; then echo "$msgprefix:Warning: substitution resulted in no content change on file \"$file\"" 1>&2 fi else substdone=yes fi fi # optionally remove preserved original file if [ ".$opt_b" = . ]; then if [ ".$opt_t" = .yes ]; then echo "\$ rm -f $file$orig" fi if [ ".$opt_n" = .no ]; then rm -f $file$orig fi fi done if [ ".$opt_q" = .no ] && [ ".$opt_w" = .no ]; then if [ ".$substdone" = .no ]; then if [ ".$files_num" = .1 ]; then echo "$msgprefix:Warning: substitution resulted in no content change on file \"$file\"" 1>&2 else echo "$msgprefix:Warning: substitution resulted in no content change on any file" 1>&2 fi fi fi else # apply operation(s) to stdin/stdout if [ ".$opt_v" = .yes ]; then echo "patching " 1>&2 fi if [ ".$opt_t" = .yes ]; then echo "\$ $sedcmd" fi if [ ".$opt_n" = .no ]; then eval "$sedcmd" fi fi shtool_exit 0 ;; platform ) ## ## platform -- Platform Identification Utility ## Copyright (c) 2003-2008 Ralf S. Engelschall ## # option post-processing if [ ".$opt_t" != . ]; then case "$opt_t" in binary ) # binary package id (OpenPKG RPM) opt_F="%-%" opt_L=yes opt_S="" opt_C="+" ;; build ) # build time checking (OpenPKG RPM) opt_F="%-%" opt_L=yes opt_S="" opt_C="+" ;; gnu ) # GNU config.guess style -- opt_F="%-unknown-%" opt_L=yes opt_S="" opt_C="+" ;; web ) # non-whitespace HTTP Server-header id opt_F="%-%" opt_S="/" opt_C="+" ;; summary) # human readable verbose summary information opt_F="Class: %[sc] (%[ac])\\nProduct: %[sp] (%[ap])\\nTechnology: %[st] (%[at])" opt_S=" " opt_C="/" ;; all-in-one ) # full-table all-in-one information opt_F="" opt_F="${opt_F}concise architecture class: %\\n" opt_F="${opt_F}regular architecture class: %{ac}\\n" opt_F="${opt_F}verbose architecture class: %[ac]\\n" opt_F="${opt_F}concise architecture product: %\\n" opt_F="${opt_F}regular architecture product: %{ap}\\n" opt_F="${opt_F}verbose architecture product: %[ap]\\n" opt_F="${opt_F}concise architecture technology: %\\n" opt_F="${opt_F}regular architecture technology: %{at}\\n" opt_F="${opt_F}verbose architecture technology: %[at]\\n" opt_F="${opt_F}concise system class: %\\n" opt_F="${opt_F}regular system class: %{sc}\\n" opt_F="${opt_F}verbose system class: %[sc]\\n" opt_F="${opt_F}concise system product: %\\n" opt_F="${opt_F}regular system product: %{sp}\\n" opt_F="${opt_F}verbose system product: %[sp]\\n" opt_F="${opt_F}concise system technology: %\\n" opt_F="${opt_F}regular system technology: %{st}\\n" opt_F="${opt_F}verbose system technology: %[st]" ;; * ) echo "$msgprefix:Error: invalid type \`$opt_t'" 1>&2 exit 1 ;; esac fi # assemble initial platform information UNAME_MACHINE=`(uname -m) 2>/dev/null` ||\ UNAME_MACHINE=`(uname -p) 2>/dev/null` ||\ UNAME_MACHINE='unknown' UNAME_SYSTEM=`(uname -s) 2>/dev/null` ||\ UNAME_SYSTEM='unknown' UNAME_RELEASE=`(uname -r) 2>/dev/null` ||\ UNAME_RELEASE=`(uname -v) 2>/dev/null` ||\ UNAME_RELEASE='unknown' UNAME="${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}" AC=""; AP=""; AT="" SC=""; SP=""; ST="" # dispatch into platform specific sections case "${UNAME}" in # FreeBSD *:FreeBSD:* ) # determine architecture AC="${UNAME_MACHINE}" case "${AC}" in i386 ) AC="iX86" ;; esac AP="${AC}" AT="${AP}" if [ ".${AT}" = ".iX86" ]; then case "`(/sbin/sysctl -n hw.model) 2>&1`" in *"Xeon"* | *"Pentium Pro"* | *"Cyrix 6x86MX"* | *"Pentium II"* | *"Pentium III"* | *"Pentium 4"* | *"Celeron"* ) AT="i686" ;; *"Pentium"* ) AT="i586" ;; *"i486[SD]X"* | *"Cyrix 486"* | *"Cyrix [56]x86"* | *"Blue Lightning" | *"Cyrix 486S/DX" ) AT="i486" ;; *"i386[SD]X"* | *"NexGen 586"* ) AT="i386" ;; esac fi # determine system r=`echo "${UNAME_RELEASE}" |\ sed -e 's;[()];;' -e 's/\(-.*\)$/[\1]/'` ST="FreeBSD ${r}" SP="${ST}" case "${r}" in 1.* ) SC="4.3BSD" ;; * ) SC="4.4BSD" ;; esac ;; # NetBSD *:NetBSD:* ) # determine architecture AT="${UNAME_MACHINE}" AP="${AT}" case "${AP}" in i[3-6]86 ) AP="iX86" ;; esac AC="${AP}" # determine system r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'` ST="NetBSD ${r}" SP="${ST}" case "${r}" in 0.* ) SC="4.3BSD" ;; * ) SC="4.4BSD" ;; esac ;; # OpenBSD *:OpenBSD:* ) # determine architecture AT="${UNAME_MACHINE}" AP="${AT}" case "${AP}" in i[3-6]86 ) AP="iX86" ;; esac AC="${AP}" # determine system r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'` ST="OpenBSD ${r}" SP="${ST}" SC="4.4BSD" ;; # DragonFly BSD *:DragonFly:* ) # determine architecture AT="${UNAME_MACHINE}" AP="${AT}" case "${AP}" in i[3-6]86 ) AP="iX86" ;; esac AC="${AP}" # determine system r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'` ST="DragonFly ${r}" SP="${ST}" SC="4.4BSD" ;; # GNU/Linux *:Linux:* ) # determine architecture AT="${UNAME_MACHINE}" case "${AT}" in ia64 ) AT="IA64" ;; x86_64 ) AT='AMD64' ;; parisc ) AT="HPPA32" ;; parisc64 ) AT="HPPA64" ;; esac AP="${AT}" case "${AP}" in i[3-6]86 ) AP='iX86' ;; esac AC="${AP}" # determine system v_kern=`echo "${UNAME_RELEASE}" |\ sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/'` v_libc=`(strings /lib/libc.so.* | grep '^GLIBC_' | sed -e 's/^GLIBC_//' |\ env -i sort -n | sed -n -e '$p' | sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/') 2>/dev/null` ST="GNU/${v_libc}/<${v_kern}>" if [ -f /etc/lsb-release ]; then eval `( . /etc/lsb-release echo "SC=\"LSB${LSB_VERSION}\"" if [ ".${DISTRIB_ID}" != . -a ".${DISTRIB_RELEASE}" != . ]; then echo "SP=\"${DISTRIB_ID} ${DISTRIB_RELEASE}\"" fi ) 2>/dev/null` fi if [ ".$SP" = . ]; then for tagfile in x \ `cd /etc && \ /bin/ls *[_-]release *[_-]version 2>/dev/null | env -i sort | \ sed -e '/^redhat-release$/d' -e '/^lsb-release$/d'; \ echo redhat-release lsb-release` do [ ".${tagfile}" = .x ] && continue [ ! -f "/etc/${tagfile}" ] && continue n=`echo ${tagfile} | sed -e 's/[_-]release$//' -e 's/[_-]version$//'` v=`(grep VERSION /etc/${tagfile}; cat /etc/${tagfile}) | grep '[0-9]' | sed -e 'q' |\ sed -e 's/^/#/' \ -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \ -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \ -e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \ -e 's/^#.*$//'` case "`util_lower ${n}`" in redhat ) if [ ".`egrep '(Red Hat Enterprise Linux|CentOS)' /etc/${tagfile}`" != . ]; then n="ed at nterprise inux" else n="ed at inux" fi ;; debian ) n="Debian[ GNU/Linux]" ;; ubuntu ) n="Ubuntu[ GNU/Linux]" ;; fedora ) n=" Core[ GNU/Linux]" ;; suse ) n="[Novell ]SUSE[ Linux]" ;; mandrake*|mandriva ) n="Mandriva[ Linux]" ;; gentoo ) n="Gentoo[ GNU/Linux]" ;; slackware ) n="Slackware[ Linux]" ;; turbolinux ) n="TurboLinux" ;; unitedlinux ) n="UnitedLinux" ;; * ) n="${n}[ GNU/Linux]" ;; esac case "$n" in *"<"*">"* ) SP="$n <$v>" ;; * ) SP="$n $v" ;; esac break done fi [ ".$SP" = . ] && SP="${ST}" [ ".$SC" = . ] && SC="LSB" ;; # Sun Solaris *:SunOS:* ) # determine architecture AT="${UNAME_MACHINE}" case "${AT}" in i86pc ) AT="iX86" case "`(/bin/isainfo -k) 2>&1`" in amd64 ) AT="AMD64" ;; esac ;; esac AP="${AT}" case "${AP}" in sun4[cdm] ) AP="SPARC32" ;; sun4[uv] ) AP="SPARC64" ;; sun4* ) AP="SPARC" ;; esac AC="${AP}" case "${AC}" in SPARC* ) AC="SPARC" ;; esac # determine system ST="[Sun ]SunOS ${UNAME_RELEASE}" v=`echo "${UNAME_RELEASE}" |\ sed -e 's;^4\.;1.;' \ -e 's;^5\.\([0-6]\)[^0-9]*$;2.\1;' \ -e 's;^5\.\([0-9][0-9]*\).*;\1;'` SP="[Sun ]Solaris $v" case "${UNAME_RELEASE}" in 4.* ) SC="4.3BSD" ;; 5.* ) SC="SVR4" ;; esac ;; # SCO UnixWare *:UnixWare:* ) # determine architecture AT="${UNAME_MACHINE}" case "${AT}" in i[3-6]86 | ix86at ) AT="iX86" ;; esac AP="${AT}" # determine system v=`/sbin/uname -v` ST="[SCO ]UnixWare ${v}" SP="${ST}" SC="SVR${UNAME_RELEASE}" ;; # QNX *:QNX:* ) # determine architecture AT="${UNAME_MACHINE}" case "${AT}" in x86pc ) AT="iX86" ;; esac AP="${AT}" # determine system v="${UNAME_RELEASE}" ST="QNX[ Neutrino RTOS] ${v}" v=`echo "${v}" | sed -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\).*$;\1;'` SP="QNX[ Neutrino RTOS] ${v}" SC="QNX" ;; # SGI IRIX *:IRIX*:* ) # determine architecture AT="${UNAME_MACHINE}" AP="${AT}" case "${AP}:${UNAME_SYSTEM}" in IP*:IRIX64 ) AP="MIPS64" ;; IP*:* ) AP="MIPS" ;; esac AC="${AP}" # determine system v=`(/bin/uname -R || /bin/uname -r) 2>/dev/null | sed -e 's;[0-9.]* ;;'` ST="[SGI ]IRIX ${v}" v="${UNAME_RELEASE}" SP="[SGI ]IRIX ${v}" SC="4.2BSD/SVR3" ;; # HP HP-UX *:HP-UX:* ) # determine architecture AT="${UNAME_MACHINE}" case "${AT}" in ia64 ) AT="IA64" ;; 9000/[34]?? ) AT=M68K ;; 9000/[678][0-9][0-9]) 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 ) AT="HPPA1.0" ;; 528 ) AT="HPPA1.1" ;; 532 ) AT="HPPA2.0" case "${sc_kernel_bits}" in 32 ) AT="${AT}n" ;; 64 ) AT="${AT}w" ;; esac ;; esac ;; esac AP="${AT}" case "${AP}" in HPPA* ) AP="HPPA" ;; esac AC="${AP}" # determine system v=`echo "${UNAME_RELEASE}" | sed -e 's;^[^0-9]*;;'` ST="[HP ]-" SP="${ST}" case "${v}" in 10.* ) SC="SVR4.2" ;; [7-9]* ) SC="SVR4" ;; esac ;; # HP Tru64 (OSF1) *:OSF1:* ) # determine architecture AP="${UNAME_MACHINE}" case "${AP}" in alpha ) AP="Alpha" ;; esac alpha_type=`(/usr/sbin/psrinfo -v) 2>/dev/null |\ sed -n -e 's/^.*The alpha \([^ ][^ ]*\).*processor.*$/\1/p' | sed -e 'q'` AT="${AP}${alpha_type}" AC="${AP}" # determine system v=`echo "${UNAME_RELEASE}" | sed -e 's;^[VTX];;'` ST="[HP ]Tru64 ${v}" SP="${ST}" SC="OSF1" ;; # IBM AIX *:AIX:* ) # determine architecture cpu_arch=RS6000 if [ -x /usr/sbin/lsdev -a -x /usr/sbin/lsattr ]; then cpu_id=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if [ ".`/usr/sbin/lsattr -El ${cpu_id} | grep -i powerpc`" != . ]; then cpu_arch=PPC fi elif [ -d /QOpenSys ]; then # IBM i5/OS (aka OS/400) with PASE (Portable Application Solutions Environment) cpu_arch=PPC fi if [ -x /usr/bin/oslevel ]; then os_level=`/usr/bin/oslevel` else os_level="`uname -v`.`uname -r`" fi os_level=`echo "${os_level}" |\ sed -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\)\(\.[0-9][0-9]*\)\(.*\)$;<\1>\2[\3];' \ -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\)\(.*\)$;<\1>\2;'` AT="${cpu_arch}" AP="${AT}" AC="${AP}" # determine system ST="[IBM ]${os_level}" SP="${ST}" case "${os_level}" in [12]* ) SC="SVR2" ;; * ) SC="SVR4" ;; esac ;; # Apple Mac OS X (Darwin) *:Darwin:* ) # determine architecture AT="`uname -p`" case "${AT}" in powerpc ) AT="PPC" ;; esac AP="${AT}" case "${AP}" in i?86 ) AP="iX86" ;; esac AC="${AP}" # determine system unset v1; unset v2; unset v3 eval `echo "${UNAME_RELEASE}" |\ sed -e 's/^/#/' \ -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \ -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \ -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \ -e 's/^#.*$/v1="0"/'` ST="[Apple ]<${UNAME_SYSTEM} ${v1}>${v2+.$v2}${v3+[.$v3]}" SP="$ST" v="`(sw_vers) 2>/dev/null | grep 'ProductVersion:' | sed -e 's/^ProductVersion:[^0-9]*\([0-9][0-9.]*\).*$/\1/'`" if [ ".$v" = . ]; then for name in System Server; do if [ -f /System/Library/CoreServices/${name}Version.plist ]; then v=`(defaults read "/System/Library/CoreServices/${name}Version" "ProductVersion") 2>/dev/null` [ ".$v" != . ] && break fi done fi if [ ".$v" != . ]; then unset v1; unset v2; unset v3 eval `echo "${v}" |\ sed -e 's/^/#/' \ -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \ -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \ -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \ -e 's/^#.*$/v1="0"/'` SP="[Apple ]Mac OS X ${v1}${v2+.$v2}${v3+[.$v3]}" fi SC="4.4BSD/Mach3.0" ;; # Windows/Cygwin *:CYGWIN*:* ) # determine architecture AT="`uname -m`" AP="${AT}" case "${AP}" in i?86 ) AP="iX86" ;; esac AC="${AP}" # determine system unset v1; unset v2; unset v3 eval `echo "${UNAME_RELEASE}" |\ sed -e 's/^/#/' \ -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \ -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \ -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \ -e 's/^#.*$/v1="0"/'` ST="Cygwin ${v1}${v2+.$v2}${v3+[.$v3]}" SP="$ST" SC="Windows" v=`echo "${UNAME_SYSTEM}" | sed -e 's/^CYGWIN_NT-//' |\ sed -e 's/^/#/' -e 's/^#\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' -e 's/^#.*$//'` case "$v" in 4.0 ) SC="$SC[ NT]" ;; 5.0 ) SC="$SC[ 2000]" ;; 5.1 ) SC="$SC[ XP]" ;; 6.0 ) SC="$SC[ Vista]" ;; esac ;; # TODO ...ADD YOUR NEW PLATFORM CHECK HERE... TODO # *:XXX:* ) # ... # ;; # ...A STILL UNKNOWN PLATFORM... * ) AT=`echo "${UNAME_MACHINE}" | sed -e "s; ;${opt_C};g"` AP="${AT}" AC="${AP}" v=`echo "${UNAME_RELEASE}" |\ sed -e 's/^/#/' \ -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \ -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \ -e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \ -e 's/^#.*$/?/'` ST="${UNAME_SYSTEM} ${v}" SP="${ST}" SC="${SP}" ;; esac # provide fallback values [ ".$AT" = . ] && AT="${AP:-${AC}}" [ ".$AP" = . ] && AP="${AT:-${AC}}" [ ".$AC" = . ] && AC="${AP:-${AT}}" [ ".$ST" = . ] && ST="${SP:-${SC}}" [ ".$SP" = . ] && SP="${ST:-${SC}}" [ ".$SC" = . ] && SC="${SP:-${ST}}" # support explicit enforced verbose/concise output if [ ".$opt_v" = .yes ]; then opt_F=`echo ":$opt_F" | sed -e 's/^://' -e 's/%\([as][cpt]\)/%[\1]/g'` elif [ ".$opt_c" = .yes ]; then opt_F=`echo ":$opt_F" | sed -e 's/^://' -e 's/%\([as][cpt]\)/%<\1>/g'` fi # provide verbose and concise variants AC_V=""; AC_N=""; AC_C="" AP_V=""; AP_N=""; AP_C="" AT_V=""; AT_N=""; AT_C="" SC_V=""; SC_N=""; SC_C="" SP_V=""; SP_N=""; SP_C="" ST_V=""; ST_N=""; ST_C="" for var_lc in at ap ac st sp sc; do case "$opt_F" in *"%[${val_lc}]"* | *"%{${val_lc}}"* | *"%${val_lc}"* | *"%<${val_lc}>"* ) var_uc=`util_upper "$var_lc"` eval "val=\"\$${var_uc}\"" val_V=""; val_N=""; val_C="" case "$opt_F" in *"%[${var_lc}]"* ) val_V=`echo ":$val" | \ sed -e 's/^://' \ -e 's;\[\([^]]*\)\];\1;g' \ -e 's;<\([^>]*\)>;\1;g' \ -e "s; ;§§;g" \ -e "s;/;%%;g" \ -e "s;§§;${opt_S};g" \ -e "s;%%;${opt_C};g"` eval "${var_uc}_V=\"\${val_V}\"" ;; esac case "$opt_F" in *"%{${var_lc}}"* | *"%${var_lc}"* ) val_N=`echo ":$val" | \ sed -e 's/^://' \ -e 's;\[\([^]]*\)\];;g' \ -e 's;<\([^>]*\)>;\1;g' \ -e "s; ;§§;g" \ -e "s;/;%%;g" \ -e "s;§§;${opt_S};g" \ -e "s;%%;${opt_C};g"` eval "${var_uc}_N=\"\${val_N}\"" ;; esac case "$opt_F" in *"%<${var_lc}>"* ) val_C=`echo ":$val" | \ sed -e 's/^://' \ -e 's;\[\([^]]*\)\];;g' \ -e 's;[^<]*<\([^>]*\)>[^<]*;\1;g' \ -e "s; ;§§;g" \ -e "s;/;%%;g" \ -e "s;§§;${opt_S};g" \ -e "s;%%;${opt_C};g"` eval "${var_uc}_C=\"\${val_C}\"" ;; esac ;; esac done # create output string output=`echo ":$opt_F" |\ sed -e "s/^://" \ -e "s;%\\[ac\\];${AC_V};g" \ -e "s;%{ac};${AC_N};g" \ -e "s;%ac;${AC_N};g" \ -e "s;%;${AC_C};g" \ -e "s;%\\[ap\\];${AP_V};g" \ -e "s;%{ap};${AP_N};g" \ -e "s;%ap;${AP_N};g" \ -e "s;%;${AP_C};g" \ -e "s;%\\[at\\];${AT_V};g" \ -e "s;%{at};${AT_N};g" \ -e "s;%at;${AT_N};g" \ -e "s;%;${AT_C};g" \ -e "s;%\\[sc\\];${SC_V};g" \ -e "s;%{sc};${SC_N};g" \ -e "s;%sc;${SC_N};g" \ -e "s;%;${SC_C};g" \ -e "s;%\\[sp\\];${SP_V};g" \ -e "s;%{sp};${SP_N};g" \ -e "s;%sp;${SP_N};g" \ -e "s;%;${SP_C};g" \ -e "s;%\\[st\\];${ST_V};g" \ -e "s;%{st};${ST_N};g" \ -e "s;%st;${ST_N};g" \ -e "s;%;${ST_C};g" \ -e 's/\\\\n/^/g' |\ tr '^' '\012'` # support lower/upper-case mapping if [ ".$opt_L" = .yes ]; then output=`util_lower "$output"` elif [ ".$opt_U" = .yes ]; then output=`util_upper "$output"` fi # display output string if [ ".$opt_n" = .yes ]; then echo . | awk '{ printf("%s", output); }' output="$output" else echo "$output" fi shtool_exit 0 ;; arx ) ## ## arx -- Extended archive command ## Copyright (c) 1999-2008 Ralf S. Engelschall ## ar_prg="$opt_C" ar_cmd="$1"; shift archive="$1"; shift files="$*" # walk through the file list and expand archives members ar_tmpdir=`echo $archive | sed -e 's;[^/]*$;.arx;'` nfiles='' if [ ".$files" != . ]; then for file in $files; do if [ ! -f $file ]; then echo "$msgprefix:Error: input file not found: $file" 1>&2 shtool_exit 1 fi case $file in *.a ) if [ ! -d $ar_tmpdir ]; then if [ ".$opt_t" = .yes ]; then echo "mkdir $ar_tmpdir" 1>&2 fi mkdir $ar_tmpdir fi case $ar_tmpdir in .arx ) from="../$file" ;; * ) dir=`echo $file | sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;'` base=`echo $file | sed -e 's;.*/\([^/]*\)$;\1;'` from="`cd $dir; pwd`/$base" ;; esac if [ ".$opt_t" = .yes ]; then echo "(cd $ar_tmpdir && $ar_prg x $from)" 1>&2 fi (cd $ar_tmpdir && eval $ar_prg x $from) if [ $? -ne 0 ]; then echo "$msgprefix:Error: member extraction failed for archive: $file" 1>&2 shtool_exit 1 fi for member in - `eval $ar_prg t $file | sed -e '/_\.SYMDEF/d'`; do [ ".$member" = .- ] && continue nfiles="$nfiles $ar_tmpdir/$member" done ;; * ) nfiles="$nfiles $file" ;; esac done fi # run the final archive command if [ ".$opt_t" = .yes ]; then echo "$ar_prg $ar_cmd $archive $nfiles" 1>&2 fi eval $ar_prg $ar_cmd $archive $nfiles if [ $? -ne 0 ]; then echo "$msgprefix:Error: archive command failed" 1>&2 shtool_exit $? fi # cleanup and die gracefully if [ -d $ar_tmpdir ]; then if [ ".$opt_t" = .yes ]; then echo "rm -rf $ar_tmpdir" 1>&2 fi rm -rf $ar_tmpdir fi shtool_exit 0 ;; slo ) ## ## slo -- Separate linker options by library class ## Copyright (c) 1998-2008 Ralf S. Engelschall ## DIFS="$IFS" # parse out -L and -l options from command line DIRS='' LIBS='' ARGV='' optprev='' for opt do # concatenate with previous option if exists if [ ".$optprev" != . ]; then opt="${optprev}${opt}"; optprev='' fi # remember options for arg if used stand-alone if [ ".$opt" = ".-L" ] || [ ".$opt" = ".-l" ]; then optprev="$opt" continue; fi # split argument into option plus option argument arg="`echo $opt | cut -c3-`" opt="`echo $opt | cut -c1-2`" # store into containers case $opt in -L) DIRS="$DIRS:$arg" ;; -l) LIBS="$LIBS:$arg" ;; *) ARGV="$ARGV $opt" ;; esac done # set linker default directories DIRS_DEFAULT='/lib:/usr/lib' if [ ".$LD_LIBRARY_PATH" != . ]; then DIRS_DEFAULT="$DIRS_DEFAULT:$LD_LIBRARY_PATH" fi # sort options by class DIRS_OBJ='' LIBS_OBJ='' DIRS_PIC='' LIBS_PIC='' DIRS_DSO='' LIBS_DSO='' # for each library... OIFS="$IFS"; IFS=':' for lib in $LIBS; do [ ".$lib" = . ] && continue found='no' found_indefdir='no' found_type='' found_dir='' # for each directory... OIFS2="$IFS"; IFS=":$DIFS" for dir in ${DIRS} switch-to-defdirs ${DIRS_DEFAULT}; do [ ".$dir" = . ] && continue [ ".$dir" = .switch-to-defdirs ] && found_indefdir=yes [ ! -d $dir ] && continue # search the file OIFS3="$IFS"; IFS="$DIFS" for file in '' `cd $dir && env -i /bin/ls lib${lib}.* 2>/dev/null`; do [ ".$file" = . ] && continue case $file in *.so|*.so.[0-9]*|*.sl|*.sl.[0-9]* ) found=yes; found_type=DSO; break ;; *.lo|*.la ) found=yes; found_type=PIC ;; *.a ) if [ ".$found_type" = . ]; then found=yes found_type=OBJ fi ;; esac done IFS="$OIFS3" if [ ".$found" = .yes ]; then found_dir="$dir" break fi done IFS="$OIFS2" if [ ".$found" = .yes ]; then if [ ".$found_indefdir" != .yes ]; then eval "dirlist=\"\${DIRS_${found_type}}:\"" case "$dirlist" in *:$found_dir:* ) ;; * ) eval "DIRS_${found_type}=\"\$DIRS_${found_type}:${found_dir}\"" ;; esac eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\"" else eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\"" fi else LIBS_OBJ="$LIBS_OBJ:$lib" #dirlist="`echo $DIRS $DIRS_DEFAULT | sed -e 's/:/ /g'`" #echo "slo:Warning: library \"$lib\" not found in any of the following dirs:" 2>&1 #echo "slo:Warning: $dirlist" 1>&1 fi done IFS="$OIFS" # also pass-through unused dirs even if it's useless OIFS="$IFS"; IFS=':' for dir in $DIRS; do dirlist="${DIRS_OBJ}:${DIRS_PIC}:${DIRS_DSO}:" case "$dirlist" in *:$dir:* ) ;; * ) DIRS_OBJ="$DIRS_OBJ:$dir" ;; esac done IFS="$OIFS" # reassemble the options but separated by type for type in OBJ PIC DSO; do OIFS="$IFS"; IFS=':' eval "libs=\"\$LIBS_${type}\"" opts='' for lib in $libs; do [ ".$lib" = . ] && continue opts="$opts -l$lib" done eval "LIBS_${type}=\"$opts\"" eval "dirs=\"\$DIRS_${type}\"" opts='' for dir in $dirs; do [ ".$dir" = . ] && continue opts="$opts -L$dir" done eval "DIRS_${type}=\"$opts\"" IFS="$OIFS" done # give back results for var in ARGV DIRS_OBJ LIBS_OBJ DIRS_PIC LIBS_PIC DIRS_DSO LIBS_DSO; do eval "val=\"\$${var}\"" val="`echo $val | sed -e 's/^ *//'`" echo "${opt_p}${var}=\"${val}\"" done shtool_exit 0 ;; scpp ) ## ## scpp -- Sharing C Pre-Processor ## Copyright (c) 1999-2008 Ralf S. Engelschall ## srcs="$*" output="${opt_o}.n" # find a reasonable Awk awk='' paths=`echo $PATH |\ sed -e 's%/*:%:%g' -e 's%/$%%' \ -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \ -e 's/:/ /g'` for name in gawk nawk awk; do for path in $paths; do if [ -r "$path/$name" ]; then awk="$path/$name" break fi done if [ ".$awk" != . ]; then break fi done if [ ".$awk" = . ]; then echo "$msgprefix:Error: cannot find a reasonable Awk" 1>&2 shtool_exit 1 fi # parse source file(s) if [ ".$opt_v" = .yes ]; then echo "Parsing:" | $awk '{ printf("%s", $0); }' 1>&2 fi for src in $srcs; do if [ ".$opt_v" = .yes ]; then echo $src | $awk '{ printf(" %s", $0); }' 1>&2 fi if [ ".$opt_f" != . ]; then inputcmd="sed" OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_f; IFS="$OIFS" for e do inputcmd="$inputcmd -e '$e'" done inputcmd="$inputcmd '$src'" else inputcmd="cat '$src'" fi eval $inputcmd |\ $awk ' BEGIN { ln = 0; fln = 0; level = 0; mode = ""; store = ""; } { ln++; } /^#if.*/ { level++; } /^#if [a-zA-Z_][a-zA-Z0-9_]* *$/ { if ($2 == define) { mode = "D"; printf("D:#line %d \"%s\"\n", ln, src); next; } } /^#endif.*/ { level--; if (mode == "D" && level == 0) { mode = ""; next; } } /^[a-zA-Z_][a-zA-Z0-9_].*;.*/ { if ($1 == class) { printf("V:#line %d \"%s\"\n", ln, src); printf("V:%s\n", $0); printf("J:%s\n", $0); next; } } /^[a-zA-Z_][a-zA-Z0-9_].*=.*/ { if ($1 == class) { printf("V:#line %d \"%s\"\n", ln, src); printf("V:%s\n", $0); printf("J:%s\n", $0); next; } } /^[a-zA-Z_][a-zA-Z0-9_]*/ { if ($1 == class) { fln = ln; store = $0; mode = "F"; next; } } /^\{ *$/ { if (mode == "F") { printf("F:#line %d \"%s\"\n", fln, src); printf("F:%s;\n", store); printf("I:%s;\n", store); store = ""; mode = ""; next; } } { if (mode == "D") printf("D:%s\n", $0); else if (mode == "F") store = store " " $0; } ' "src=$src" "define=$opt_D" "class=$opt_C" >>$tmpfile done if [ ".$opt_v" = .yes ]; then echo "" 1>&2 fi # start generating output header echo "/* $opt_o -- autogenerated from $opt_t, DO NOT EDIT! */" >$output echo "#line 1 \"$opt_t\"" >>$output sed <$opt_t -e "1,/^${opt_M} *\$/p" -e 'd' |\ sed -e "/^${opt_M} *\$/d" >>$output # merge in the define blocks grep '^D:' $tmpfile | sed -e 's/^D://' >>$output # generate standard prolog echo "#line 1 \"_ON_THE_FLY_\"" >>$output echo "" >>$output echo "/* make sure the scpp source extensions are skipped */" >>$output echo "#define $opt_D 0" >>$output echo "#define $opt_C /**/" >>$output # generate namespace hiding for variables echo "" >>$output echo "/* move intern variables to hidden namespace */" >>$output grep '^J:' $tmpfile | sed >>$output \ -e 's/^J://' \ -e 's/ */ /g' \ -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\)\[\];.*$/#define \1 __\1/' \ -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\)\[\] =.*$/#define \1 __\1/' \ -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\);.*$/#define \1 __\1/' \ -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\) =.*$/#define \1 __\1/' # generate namespace hiding for functions echo "" >>$output echo "/* move intern functions to hidden namespace */" >>$output grep '^I:' $tmpfile | sed >>$output \ -e 's/^I://' \ -e 's/\([ (]\) */\1/g' \ -e 's/ *\([),]\)/\1/g' \ -e 's/^[^(]*[ *]\([a-zA-Z0-9_]*\)(.*$/#define \1 __\1/' # generate prototypes for variables echo "" >>$output echo "/* prototypes for intern variables */" >>$output grep '^V:' $tmpfile | sed >>$output \ -e 's/^V://' \ -e 's/ */ /g' \ -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\[\]\);.*$/\1;/' \ -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\[\]\) =.*$/\1;/' \ -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\);.*$/\1;/' \ -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\) =.*$/\1;/' \ -e 's/ ;/;/g' \ -e "s/^$opt_C /extern /" # generate prototypes for functions echo "" >>$output echo "/* prototypes for intern functions */" >>$output grep '^F:' $tmpfile | sed >>$output \ -e 's/^F://' \ -e 's/\([ (]\) */\1/g' \ -e 's/ *\([),]\)/\1/g' \ -e 's/\([* ]\)[a-zA-Z0-9_]*,/\1,/g' \ -e 's/\([* ]\)[a-zA-Z0-9_]*);/\1);/g' \ -e 's/(\*[a-zA-Z0-9_]*)(/(*)(/g' \ -e 's/\([ (]\) */\1/g' \ -e 's/ *\([),]\)/\1/g' \ -e "s/^$opt_C /extern /" # finish generating output header n=`(echo ''; sed <$opt_t -e "1,/^${opt_M} *\$/p" -e 'd') |\ wc -l | sed -e 's;^ *\([0-9]*\) *$;\1;'` echo "#line $n \"$opt_t\"" >>$output sed <$opt_t -e "/^${opt_M} *\$/,\$p" -e 'd' |\ sed -e "/^${opt_M} *\$/d" >>$output # create final output file if [ -f $opt_o ]; then if [ ".$opt_p" = .yes ]; then grep -v '^#line' $opt_o >$tmpfile.o grep -v '^#line' $output >$tmpfile.n out_old="$tmpfile.o" out_new="$tmpfile.n" else out_old="$opt_o" out_new="$output" fi if cmp -s $out_old $out_new; then : else cp $output $opt_o fi else cp $output $opt_o fi rm -f $output rm -f $tmpfile $tmpfile.* >/dev/null 2>&1 shtool_exit 0 ;; version ) ## ## version -- Maintain a version information file ## Copyright (c) 1994-2008 Ralf S. Engelschall ## file="$1" # determine prefix and name name="$opt_n" prefix="$opt_p" # determine current version triple="$opt_s" if [ ".$triple" != . ]; then # use given triple if [ ".`echo $triple | grep '[0-9]*.[0-9]*[sabp.][0-9]*'`" = . ]; then echo "$msgprefix:Error: invalid argument to option \`-s': \`$opt_s'" 1>&2 shtool_exit 1 fi eval `echo $triple |\ sed -e 's%\([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\).*%\ ver="\1";rev="\2";typ="\3";lev="\4"%'` tim=calc elif [ -r $file ]; then # determine triple from given file eval `grep 'Version [0-9]*.[0-9]*[sabp.][0-9]* ([0-9]*-[a-zA-Z]*-[0-9]*)' $file |\ sed -e 's%.*Version \([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\) (\([0-9]*-[a-zA-Z]*-[0-9]*\)).*%\ ver="\1";rev="\2";typ="\3";lev="\4";tim="\5"%' -e 'q'` else # intialise to first version ver=0 rev=1 typ=. lev=0 tim=calc fi # determine new version in batch if [ ".$opt_i" != . ]; then case $opt_i in v ) ver=`expr $ver + 1` rev=0 lev=0 ;; r ) rev=`expr $rev + 1` lev=0 ;; l ) lev=`expr $lev + 1` ;; * ) echo "$msgprefix:Error: invalid argument to option \`-i': \`$opt_i'" 1>&2 shtool_exit 1 ;; esac tim=calc fi # determine new version interactively if [ ".$opt_e" = .yes ]; then echo "old version: ${ver}.${rev}${typ}${lev}" while [ 1 ]; do echo dummy | awk '{ printf("new version: "); }' read triple case $triple in [0-9]*.[0-9]*[sabp.][0-9]* ) ;; * ) echo "$msgprefix:Error: invalid version string entered: \`$triple'" 1>&2 continue ;; esac break done eval `echo $triple |\ sed -e 's%^\([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\)$%\ ver="\1";rev="\2";typ="\3";lev="\4"%'` tim=calc fi # determine hexadecimal and libtool value of version case $typ in a ) typnum=0; levnum=$lev ;; b ) typnum=1; levnum=$lev ;; p | . ) typnum=2; levnum=$lev ;; s ) typnum=15; levnum=255 ;; # snapshots are special esac hex=`echo "$ver:$rev:$typnum:$levnum" |\ awk -F: '{ printf("0x%x%02x%1x%02x", $1, $2, $3, $4); }' |\ tr 'abcdef' 'ABCDEF'` ltv=`echo "$ver:$rev:$typnum:$levnum" |\ awk -F: '{ printf("%d:%d", $1*10 + $2, $3*10 + $4); }'` # determine date if [ ".$tim" = .calc ]; then day=`date '+%d'` month=`date '+%m'` year=`date '+%Y' 2>/dev/null` if [ ".$time_year" = . ]; then year=`date '+%y'` case $year in [5-9][0-9]) year="19$year" ;; [0-4][0-9]) year="20$year" ;; esac fi case $month in 1|01) month='Jan' ;; 2|02) month='Feb' ;; 3|03) month='Mar' ;; 4|04) month='Apr' ;; 5|05) month='May' ;; 6|06) month='Jun' ;; 7|07) month='Jul' ;; 8|08) month='Aug' ;; 9|09) month='Sep' ;; 10) month='Oct' ;; 11) month='Nov' ;; 12) month='Dec' ;; esac tim="${day}-${month}-${year}" fi # perform result actions mode=show if [ ".$opt_i" != . ]; then mode=edit elif [ ".$opt_e" = .yes ]; then mode=edit elif [ ".$opt_s" != . ]; then mode=edit fi if [ ".$mode" = .show ]; then # just display the current version case $opt_d in short ) echo "${ver}.${rev}${typ}${lev}" ;; long ) echo "${ver}.${rev}${typ}${lev} ($tim)" ;; libtool ) echo "${ltv}" ;; hex ) echo "${hex}" ;; * ) echo "$msgprefix:Error: invalid argument to option \`-d': \`$opt_d'" 1>&2 shtool_exit 1 ;; esac else # update the version file # pre-generate various strings triple="${ver}.${rev}${typ}${lev}" vHex="$hex" vShort="${triple}" vLong="${triple} (${tim})" vTeX="This is ${name}, Version ${triple} (${tim})" vGNU="${name} ${triple} (${tim})" vWeb="${name}/${triple}" vSCCS="@(#)${name} ${triple} (${tim})" vRCS="\$Id: ${name} ${triple} (${tim}) \$" # determine string out of filename # (do NOT try to optimize this in any way because of portability) filestr=`util_upper "$file" | tr './%+' '____' | sed -e 's/-/_/g'` # generate uppercase prefix prefixupper=`util_upper "$prefix"` # create the version file according the the selected language echo "new version: ${vLong}" cp /dev/null $file case $opt_l in txt ) echo >>$file "" echo >>$file " ${file} -- Version Information for ${name} (syntax: Text)" echo >>$file " [automatically generated and maintained by GNU shtool]" echo >>$file "" echo >>$file " $vTeX" echo >>$file "" ;; c ) echo >>$file "/*" echo >>$file "** ${file} -- Version Information for ${name} (syntax: C/C++)" echo >>$file "** [automatically generated and maintained by GNU shtool]" echo >>$file "*/" echo >>$file "" echo >>$file "#ifdef _${filestr}_AS_HEADER_" echo >>$file "" echo >>$file "#ifndef _${filestr}_" echo >>$file "#define _${filestr}_" echo >>$file "" echo >>$file "#define ${prefixupper}VERSION ${vHex}" echo >>$file "" echo >>$file "typedef struct {" echo >>$file " const int v_hex;" echo >>$file " const char *v_short;" echo >>$file " const char *v_long;" echo >>$file " const char *v_tex;" echo >>$file " const char *v_gnu;" echo >>$file " const char *v_web;" echo >>$file " const char *v_sccs;" echo >>$file " const char *v_rcs;" echo >>$file "} ${prefix}version_t;" echo >>$file "" echo >>$file "extern ${prefix}version_t ${prefix}version;" echo >>$file "" echo >>$file "#endif /* _${filestr}_ */" echo >>$file "" echo >>$file "#else /* _${filestr}_AS_HEADER_ */" echo >>$file "" echo >>$file "#define _${filestr}_AS_HEADER_" echo >>$file "#include \"${file}\"" echo >>$file "#undef _${filestr}_AS_HEADER_" echo >>$file "" echo >>$file "${prefix}version_t ${prefix}version = {" echo >>$file " ${vHex}," echo >>$file " \"${vShort}\"," echo >>$file " \"${vLong}\"," echo >>$file " \"${vTeX}\"," echo >>$file " \"${vGNU}\"," echo >>$file " \"${vWeb}\"," echo >>$file " \"${vSCCS}\"," echo >>$file " \"${vRCS}\"" echo >>$file "};" echo >>$file "" echo >>$file "#endif /* _${filestr}_AS_HEADER_ */" echo >>$file "" ;; m4 ) echo >>$file "##" echo >>$file "## ${file} -- Version Information for ${name} (syntax: M4)" echo >>$file "## [automatically generated and maintained by GNU shtool]" echo >>$file "##" echo >>$file "" echo >>$file "m4_define([v_hex], [${vHex}])" echo >>$file "m4_define([v_short], [${vShort}])" echo >>$file "m4_define([v_long], [${vLong}])" echo >>$file "m4_define([v_tex], [${vTeX}])" echo >>$file "m4_define([v_gnu], [${vGNU}])" echo >>$file "m4_define([v_web], [${vWeb}])" echo >>$file "m4_define([v_sccs], [${vSCCS}])" echo >>$file "m4_define([v_rcs], [${vRCS}])" echo >>$file "" ;; perl ) echo >>$file "##" echo >>$file "## ${file} -- Version Information for ${name} (syntax: Perl)" echo >>$file "## [automatically generated and maintained by GNU shtool]" echo >>$file "##" echo >>$file "" echo >>$file "our \$${prefix}version = {" echo >>$file " 'v_hex' => ${vHex}," echo >>$file " 'v_short' => \"${vShort}\"," echo >>$file " 'v_long' => \"${vLong}\"," echo >>$file " 'v_tex' => \"${vTeX}\"," echo >>$file " 'v_gnu' => \"${vGNU}\"," echo >>$file " 'v_web' => \"${vWeb}\"," echo >>$file " 'v_sccs' => \"${vSCCS}\"," echo >>$file " 'v_rcs' => \"\\${vRCS}/\"" echo >>$file "};" echo >>$file "" echo >>$file "1;" echo >>$file "" ;; python ) echo >>$file "##" echo >>$file "## ${file} -- Version Information for ${name} (syntax: Python)" echo >>$file "## [automatically generated and maintained by GNU shtool]" echo >>$file "##" echo >>$file "" echo >>$file "class ${prefix}version:" echo >>$file " v_hex = ${vHex}" echo >>$file " v_short = \"${vShort}\"" echo >>$file " v_long = \"${vLong}\"" echo >>$file " v_tex = \"${vTeX}\"" echo >>$file " v_gnu = \"${vGNU}\"" echo >>$file " v_web = \"${vWeb}\"" echo >>$file " v_sccs = \"${vSCCS}\"" echo >>$file " v_rcs = \"${vRCS}\"" echo >>$file "" ;; * ) echo "$msgprefix:Error: invalid argument to option \`-l': \`$opt_l'" 1>&2 shtool_exit 1 ;; esac fi shtool_exit 0 ;; path ) ## ## path -- Deal with program paths ## Copyright (c) 1998-2008 Ralf S. Engelschall ## namelist="$*" # check whether the test command supports the -x option if [ -x /bin/sh ] 2>/dev/null; then minusx="-x" else minusx="-r" fi # split path string paths="`echo $opt_p |\ sed -e 's/^:/.:/' \ -e 's/::/:.:/g' \ -e 's/:$/:./' \ -e 's/:/ /g'`" # SPECIAL REQUEST # translate forward to reverse path if [ ".$opt_r" = .yes ]; then if [ "x$namelist" = "x." ]; then rp='.' else rp='' for pe in `IFS="$IFS/"; echo $namelist`; do rp="../$rp" done fi echo $rp | sed -e 's:/$::' shtool_exit 0 fi # SPECIAL REQUEST # strip out directory or base name if [ ".$opt_d" = .yes ]; then echo "$namelist" |\ sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' shtool_exit 0 fi if [ ".$opt_b" = .yes ]; then echo "$namelist" |\ sed -e 's;.*/\([^/]*\)$;\1;' shtool_exit 0 fi # MAGIC SITUATION # Perl Interpreter (perl) if [ ".$opt_m" = .yes ] && [ ".$namelist" = .perl ]; then rm -f $tmpfile >/dev/null 2>&1 touch $tmpfile found=0 pc=99 for dir in $paths; do dir=`echo $dir | sed -e 's;/*$;;'` nc=99 for name in perl perl5 miniperl; do if [ $minusx "$dir/$name" ] && [ ! -d "$dir/$name" ]; then perl="$dir/$name" pv=`$perl -e 'printf("%.3f", $]);'` echo "$pv:$pc:$nc:$perl" >>$tmpfile found=1 fi nc=`expr $nc - 1` done pc=`expr $pc - 1` done if [ $found = 1 ]; then perl="`cat $tmpfile | sort -r -u | sed -e 'q' | cut -d: -f4`" rm -f $tmpfile >/dev/null 2>&1 echo "$perl" shtool_exit 0 fi rm -f $tmpfile >/dev/null 2>&1 shtool_exit 1 fi # MAGIC SITUATION # C pre-processor (cpp) if [ ".$opt_m" = .yes ] && [ ".$namelist" = .cpp ]; then echo >$tmpfile.c "#include " echo >>$tmpfile.c "Syntax Error" # 1. try the standard cc -E approach cpp="${CC-cc} -E" (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out my_error=`grep -v '^ *+' $tmpfile.out` if [ ".$my_error" != . ]; then # 2. try the cc -E approach and GCC's -traditional-ccp option cpp="${CC-cc} -E -traditional-cpp" (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out my_error=`grep -v '^ *+' $tmpfile.out` if [ ".$my_error" != . ]; then # 3. try a standalone cpp command in path and lib dirs for path in $paths /lib /usr/lib /usr/local/lib; do path=`echo $path | sed -e 's;/*$;;'` if [ $minusx "$path/cpp" ] && [ ! -d "$path/cpp" ]; then cpp="$path/cpp" break fi done if [ ".$cpp" != . ]; then (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out my_error=`grep -v '^ *+' $tmpfile.out` if [ ".$my_error" != . ]; then # ok, we gave up... cpp='' fi fi fi fi rm -f $tmpfile >/dev/null 2>&1 rm -f $tmpfile.c $tmpfile.out >/dev/null 2>&1 if [ ".$cpp" != . ]; then echo "$cpp" shtool_exit 0 fi shtool_exit 1 fi # STANDARD SITUATION # iterate over names for name in $namelist; do # iterate over paths for path in $paths; do path=`echo $path | sed -e 's;/*$;;'` if [ $minusx "$path/$name" ] && [ ! -d "$path/$name" ]; then if [ ".$opt_s" != .yes ]; then echo "$path/$name" fi shtool_exit 0 fi done done shtool_exit 1 ;; esac shtool_exit 0 numdiff-5.9.0/numdiff.h0000444000175000017500000005333313054341114014303 0ustar paologpaolog/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef _NUMDIFF_H_ #define _NUMDIFF_H_ #include "system.h" #include "bitvector.h" #if defined(HAVE_LIBGMP) && !defined(DISABLE_GMP) #define USE_GMP 1 #endif /* defined(HAVE_LIBGMP) && !defined(DISABLE_GMP) */ /* The type of a hash value. */ typedef size_t hash_value; verify (hash_value_is_unsigned, ! TYPE_SIGNED (hash_value)); /* Rotate an unsigned value to the left. */ #define ROL(v, n) ((v) << (n) | (v) >> (sizeof (v) * CHAR_BIT - (n))) /* Given a hash value and a new character, return a new hash value. */ #ifdef _DEBUG_HASHING_ #define HASH(h, c) (putc((c), stderr), (c) + ROL (h, 7)) #else #define HASH(h, c) ((c) + ROL (h, 7)) #endif /* Error codes */ #define OK 0 #define LINE_INTERR 1 #define EOF_REACHED 2 #define READING_ERROR 3 #define OUT_OF_MEMORY 4 /* *** */ #define OPEN_FAILED 5 #define WRONG_USAGE 6 #define FILE_IS_BINARY 7 /* Begin section -- Math types */ #include"number.h" #ifdef USE_GMP #include typedef mpf_t Real; typedef struct { mpf_t re, im; } Complex; #else /* not USE_GMP */ typedef bc_num Real; typedef struct { bc_num re, im; } Complex; #endif /* USE_GMP */ /* End section -- Math types */ #define THRLIST_OK 0 #define THRLIST_INVALID_FORMAT -1 #define THRLIST_INVALID_RANGES -2 /* A structure of type 'thrlist_node' is used to construct lists of threshold values. */ struct __thrlist_node { Real threshold; /* the threshold value */ /* BEG1-END1 and BEG2-END2 are the ranges of fields */ /* to which the specified THRESHOLD value applies. */ /* The two ranges must have the same length, but refer */ /* to different files. */ unsigned long beg1, end1; unsigned long beg2, end2; /* DOUBLE_RANGE_SPEC is a boolean value, which is 1 if */ /* BEG1-END1 and BEG2-END2 have been both explicitely */ /* set via the command line through a specification of */ /* the form: */ /* BEG1-END1:BEG2-END2 */ /* and otherwise is equal to 0. */ int double_range_spec; /* pointer to the next node in the list */ struct __thrlist_node *next; }; typedef struct __thrlist_node thrlist_node; /* A pointer to a list of threshold values */ typedef thrlist_node *thrlist; struct numfmt { char *currency; /* currency */ char dp; /* decimal point */ char thsep; /* thousands separator */ unsigned grouping; /* Number of digits in each group */ char pos_sign; /* positive sign */ char neg_sign; /* negative sign */ char ech; /* prefix for decimal exponent */ char iu; /* symbol of the imaginary unit */ }; /* A structure of this type is used to store */ /* information about the legal format for the */ /* numbers in input. */ /* This is the number of the fields in the 'numftm' structure having "char" type. None of them can be a digit and they must have all different values (see the code of the function valid_numfmt() in the file options.c). */ #define NUMFMT_CHARS 6 typedef struct { unsigned char* ptr; size_t len, size; } flg_array; /* A structure of this type is used to store the information retrieved from the execution of a diff command */ typedef struct { unsigned long lineno1; unsigned long lineno2; unsigned long fieldno1; unsigned long fieldno2; } difference_location; /* A structure of this type is used to store the "location" of a difference between the compared files: (LINENO1,FIELDNO1) and (LINENO2, FIELDNO2) are the positions of the fields which differ */ typedef struct { /* Mask of the options */ bitvector optmask; /* Output mode. This field can take any of the values */ /* OUTMODE_* (see below) */ int output_mode; /* This is a mask of bits specifying the fields of the first file which must be ignored. */ unsigned char ghostmask1[FIELDMASK_SIZE]; /* This is a mask of bits specifying the fields of the second file which must be ignored. */ unsigned char ghostmask2[FIELDMASK_SIZE]; /* This is a mask of bits specifying the fields in the first file for which partial blurring must be enabled during the filtering procedure. */ unsigned char pblurmask1[FIELDMASK_SIZE]; /* This is a mask of bits specifying the fields in the second file for which partial blurring must be enabled during the filtering procedure. */ unsigned char pblurmask2[FIELDMASK_SIZE]; /* This is a mask of bits specifying the fields in the first file for which total blurring must be enabled during the filtering procedure. */ unsigned char tblurmask1[FIELDMASK_SIZE]; /* This is a mask of bits specifying the fields in the second file for which total blurring must be enabled during the filtering procedure. */ unsigned char tblurmask2[FIELDMASK_SIZE]; /* This parameter specifies how the relative errors */ /* have to be computed. It may have one of the */ /* following values: */ /* CLASSIC_FORMULA 0 (the default one) */ /* WR_TO_FIRST_FILE 1 */ /* WR_TO_SECOND_FILE 2 */ int relerr_formula; /* Tolerance thresholds for absolute and relative errors */ thrlist maxabserr, maxrelerr; /* Flag > 0 --> If a numeric field in the first file is greater than the */ /* corresponding numeric field in the second file, then the */ /* related difference is ignored, i.e. it is never output */ /* Flag < 0 --> If a numeric field in the first file is less than the */ /* corresponding numeric field in the second file, then the */ /* related difference is ignored, i.e. it is never output */ /* Flag = 0 --> Standard behavior: the difference between 2 corresponding */ /* numeric fields (one in the first file, the other one in */ /* the second file) is always considered and it is output */ /* whenever its absolute value is greater than the given */ /* tolerance thresholds for the absolute and relative errors.*/ signed char flag; /* Internal scale (number of digits of accuracy) */ int iscale; /* Files to be compared */ const char *file1, *file2; /* Internal fields separators (IFS) for file1 and file2 */ char **ifs1, **ifs2; /* Numeric conventions for file1 (.nf1) and file2 (.nf2) */ struct numfmt nf1, nf2; } argslist ; /* A structure of this type is used to store the options */ /* set by the user */ typedef struct { /* These variables are used to print statistics */ Real Labserr, Crelerr, Lrelerr, Cabserr; Real N1abserr, N1disperr, N2abserr, N2disperr; difference_location Labserr_location, Rabserr_location; int Nentries, Ndisperr; } statlist; enum { _H_MASK=0, /* -h option, used to recall help */ _A_MASK=1, /* -a option, used to set tolerance for abs. error */ _R_MASK=2, /* -r option, used to set tolerance for rel. error */ _2_MASK=3, /* -2 option, used to enable the "strict" control */ _S_MASK=4, /* -s option, used to explicitly set IFS */ _B_MASK=5, /* -b option, used to enable the "brief" mode */ _F_MASK=6, /* -f option, used to enable the "filter-only" mode */ _Q_MASK=7, /* -q option, used to enable "quiet" mode */ _X_MASK=8, /* -# option, used to set the precision */ _D_MASK=9, /* -d option, used to set the decimal point */ _T_MASK=10, /* -t option, used to set the thousands separator */ _G_MASK=11, /* -g option, used to set the group length */ _P_MASK=12, /* -p option, used to set the character 'positive sign' */ _N_MASK=13, /* -n option, used to set the character 'negative sign' */ _E_MASK=14, /* -e option, used to set prefix for decimal exponent */ _I_MASK=15, /* -i option, used to set the symbol of the imaginary unit */ _L_MASK=16, /* -l option, to redirect the standard error on a file */ _O_MASK=17, /* -o option, to redirect the standard output on a file */ _Z_MASK=18, /* -z option, to activate the filter (normal mode) */ _SZ_MASK=19,/* -Z option, to activate the filter (alternative mode) */ _SX_MASK=20,/* -X option, used to select which fields in the lines of the files must be ignored */ _SP_MASK=21,/* -P option, used to ignore negative errors */ _SN_MASK=22,/* -N option, used to ignore positive errors */ _SU_MASK=23,/* -U option, used to enable the "dummy" mode */ _SE_MASK=24,/* -E option, used to enable the "essential" mode */ _SV_MASK=25,/* -V option, used to enable the "verbose" mode */ _SO_MASK=26,/* -O option, used to enable the "overview" mode */ _SS_MASK=27,/* -S option, used to print statistics */ _SI_MASK=28,/* -I option, used to ignore case while comparing non numerical field */ _SH_MASK=29,/* -H option, by filtering assume large files and many scattered small changes */ _M_MASK=30, /* -m option, by filtering try hard to find a smaller set of changes */ _ST_MASK=31,/* -T option, to expand tabs in spaces */ _SB_MASK=32,/* -B option, to treat both files as binary files */ _SD_MASK=33,/* -D option, used to set the field delimiters */ _SF_MASK=34,/* -F option, used to set the formula for computing the relative errors */ _C_MASK=35, /* -c option, used to set the currency name(symbol) */ _RAW_MASK=36, /* --raw option, to print the differences in raw format */ _V_MASK=37, /* -v option, used to show version number, Copyright and No-Warrany */ MAX_NUMDIFF_OPTIONS = 100 }; /* Output modes: verbose, normal, brief, and quiet. */ /* Do not change the relative order of the values of */ /* these macros, the code in cmp_lines() (see file */ /* cmpfns.c) relies on the fact that: */ /* OUTMODE_VERBOSE > OUTMODE_NORMAL > OUTMODE_COINCISE */ /* > OUTMODE_BRIEF > OUTMODE_QUIET > OUTMODE_OVERVIEW, */ /* and OUTMODE_OVERVIEW > OUTMODE_RAW. */ enum { OUTMODE_VERBOSE= 4, OUTMODE_NORMAL= 3, OUTMODE_COINCISE= 2, OUTMODE_BRIEF= 1, OUTMODE_QUIET= 0, OUTMODE_OVERVIEW= -1, OUTMODE_RAW= -2 }; /* Methods to compute the relative differences */ enum { CLASSIC_FORMULA= 0, WR_TO_FIRST_FILE= 1, WR_TO_SECOND_FILE= 2 }; #ifndef PACKAGE #define PACKAGE "numdiff" #endif #ifndef LOCALEDIR #define LOCALEDIR "/usr/local/share/locale/" #endif /* The character representing the number zero */ #define CHAR_ZERO '0' /* The character representing the number one */ #define CHAR_ONE '1' /* The character representing the number nine */ #define CHAR_NINE '9' /* newline character */ #define NEWLINE '\n' /* Predefined values for .nf*.currency (currency name) .nf*.dp (decimal point) .nf*.thsep (thousands separator) .nf*.grouping (number of digits in each thousands group) .nf*.pos_sign (positive sign) .nf*.neg_sign (negative sign) .nf*.ech (prefix for decimal exponent) .nf*.iu (symbol of the imaginary unit) .iscale (decimal digits of accuracy) */ #define CURRENCY "" #define DP '.' #define THSEP ',' #define GROUPING 3 #define POS_SIGN '+' #define NEG_SIGN '-' #define ECH 'e' #define IU 'i' #define ISCALE 35 /* Largest possible value for .iscale */ #define MAX_ISCALE 180 /* Largest possible exponent accepted by Numdiff when a number is written in scientific notation */ #define MAX_EXPN +1073741824L /* Lowest possible exponent accepted by Numdiff when a number is written in scientific notation */ #define MIN_EXPN -1073741824L /* Macro to move ahead a pointer */ #define move_ahead(ptr) ptr++ /* Character classification macros. The macro CTYPE_DOMAIN is defined in "system.h". */ #define is_digit(c) ((unsigned int) (c) - '0' <= 9 ? 1 : 0) #define is_punct(c) (CTYPE_DOMAIN((unsigned char)(c)) && ispunct((unsigned char)(c))) #define is_print(c) (CTYPE_DOMAIN((unsigned char)(c)) && isgraph((unsigned char)(c)) && ((unsigned int) (c) - '0' > 9)) #define is_space(c) (CTYPE_DOMAIN((unsigned char)(c)) && isspace((unsigned char)(c))) /* Mathematical functions */ int cmp (Real p, Real q); int is0 (Real u); int smart_cmp (const Complex* pz1, const Complex* pz2, int flag); void printno (Real u, int m); extern Real Zero, Inf; void init_mpa(int iscale); void initR (Real* px); void initC (Complex* pz); void copyR (Real* dst, Real src); void copyC (Complex* dst, Complex src); #ifdef _MPA_DEBUG void debug_printno (Real u, int m); #endif /* _MPA_DEBUG */ void str2R (const char *q, char **endptr, int iscale, const struct numfmt* pnf, Real* pr); void str2C (const char *q, char **endptr, int iscale, const struct numfmt* pnf, Complex* pc); void add (Real s, Real t, Real* q, int iscale); void square (Real s, Real* q, int iscale); void divide (Real s, Real t, Real* q, int iscale); void divide_by_int (Real* q, int d, int iscale); void square_root (Real* q, int iscale); void Cabs (Complex z, Real* pm, int iscale); void Csub (Complex z1, Complex z2, Complex* pw, int iscale); void delR (Real* px); void delC (Complex* pz); void end_mpa(void); /* Functions used to manipulate lists of threshold specifications (see thrlist.c) */ thrlist thrlist_new (void); int thrlist_add (thrlist *plist, const char* def); int thrlist_cmp (Real r, thrlist list, unsigned long fieldno1, unsigned long fieldno2); void thrlist_dispose (thrlist *plist); /* Shared definitions coming from GNU DIFF Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1998, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU DIFF. GNU DIFF is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU DIFF is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #define TAB_WIDTH 8 /* Added by Ivano Primi, July 31 2008 */ #define MIN_ATMOST_NCOLS 16 #define DEF_ATMOST_NCOLS 130 #define MAX_ATMOST_NCOLS 512 /* What kind of changes a hunk contains. */ enum changes { /* No changes: lines common to both files. */ UNCHANGED, /* Deletes only: lines taken from just the first file. */ OLD, /* Inserts only: lines taken from just the second file. */ NEW, /* Both deletes and inserts: a hunk containing both old and new lines. */ CHANGED }; /* Variables for command line options */ #ifndef GDIFF_OPTIONS # define XTERN extern #else # define XTERN #endif /* The significance of white space during comparisons. */ XTERN enum { /* All white space is significant (the default). */ IGNORE_NO_WHITE_SPACE, /* Ignore changes due to tab expansion. */ IGNORE_TAB_EXPANSION, /* Ignore changes in horizontal white space. */ IGNORE_SPACE_CHANGE, /* Ignore all horizontal white space. */ IGNORE_ALL_SPACE } ignore_white_space; /* Treat both files as binary files (meaningful only under Doz/Windoz) */ XTERN bool binary; /* Nonzero means to not show common lines. */ XTERN bool suppress_common_lines; /* Expand tabs in the output so the text lines up properly despite the characters added to the front of each line (-T). */ XTERN bool expand_tabs; /* The half line width and column 2 offset for OUTPUT_SDIFF. */ XTERN unsigned int sdiff_half_width; XTERN unsigned int sdiff_column2_offset; /* Use heuristics for better speed with large files with a small density of changes. */ XTERN bool speed_large_files; /* Name of program the user invoked (for error messages). */ XTERN char *program_name; /* The result of comparison is an "edit script": a chain of `struct change'. Each `struct change' represents one place where some lines are deleted and some are inserted. LINE0 and LINE1 are the first affected lines in the two files (origin 0). DELETED is the number of lines deleted here from file 0. INSERTED is the number of lines inserted here in file 1. If DELETED is 0 then LINE0 is the number of the line before which the insertion was done; vice versa for INSERTED and LINE1. */ struct change { struct change *link; /* Previous or next edit command */ lin inserted; /* # lines of file 1 changed here. */ lin deleted; /* # lines of file 0 changed here. */ lin line0; /* Line number of 1st deleted line. */ lin line1; /* Line number of 1st inserted line. */ bool ignore; /* Flag used in context.c. */ }; /* Structures that describe the input files. */ /* Data on one input file being compared. */ struct file_data { int desc; /* File descriptor */ char const *name; /* File name */ struct stat stat; /* File status */ /* Buffer in which text of file is read. */ word *buffer; /* Allocated size of buffer, in bytes. Always a multiple of sizeof *buffer. */ size_t bufsize; /* Number of valid bytes now in the buffer. */ size_t buffered; /* Array of pointers to lines in the file. */ char const **linbuf; /* linbuf_base <= buffered_lines <= valid_lines <= alloc_lines. linebuf[linbuf_base ... buffered_lines - 1] are possibly differing. linebuf[linbuf_base ... valid_lines - 1] contain valid data. linebuf[linbuf_base ... alloc_lines - 1] are allocated. */ lin linbuf_base, buffered_lines, valid_lines, alloc_lines; /* Pointer to end of prefix of this file to ignore when hashing. */ char const *prefix_end; /* Count of lines in the prefix. There are this many lines in the file before linbuf[0]. */ lin prefix_lines; /* Pointer to start of suffix of this file to ignore when hashing. */ char const *suffix_begin; /* Vector, indexed by line number, containing an equivalence code for each line. It is this vector that is actually compared with that of another file to generate differences. */ lin *equivs; /* Vector, like the previous one except that the elements for discarded lines have been squeezed out. */ lin *undiscarded; /* Vector mapping virtual line numbers (not counting discarded lines) to real ones (counting those lines). Both are origin-0. */ lin *realindexes; /* Total number of nondiscarded lines. */ lin nondiscarded_lines; /* Vector, indexed by real origin-0 line number, containing TRUE for a line that is an insertion or a deletion. The results of comparison are stored here. */ bool *changed; /* 1 if file ends in a line with no final newline. */ bool missing_newline; /* 1 if at end of file. */ bool eof; /* 1 more than the maximum equivalence value used for this or its sibling file. */ lin equiv_max; }; /* The file buffer, considered as an array of bytes rather than as an array of words. */ #define FILE_BUFFER(f) ((char *) (f)->buffer) /* Describe the two files currently being compared. */ XTERN struct file_data files[2]; /* Stdio stream to output diffs to. */ #define outfile stdout /* Declare various functions. */ /* analyze.c */ int diff_2_files (struct file_data[], const argslist*); /* inout.c */ bool read_files (struct file_data[], const argslist*); /* numutil.c */ char* acxnum (const char *str, const struct numfmt* pnf); int compare_numeric_strings (const char *str1, const struct numfmt* pnf1, const char *str2, const struct numfmt* pnf2); char* hcxnum (const char *str, const struct numfmt* pnf, hash_value *ph); #ifdef USE_GMP int mpf_a2num (Real* pr, const char *q, char** endptr, const struct numfmt* pnf); #endif /* USE_GMP */ /* side.c */ void print_sdiff_script (struct change *); void print_1overview_line (const char *left, int are_different, const char *right); /* util.c */ bool lines_differ (char const *, char const *, int, int, const argslist*); void *zalloc (size_t); #define stralloc(length) zalloc ((length)+1) enum changes analyze_hunk (struct change *, lin *, lin *, lin *, lin *); #ifdef _DEBUG_SCRIPT_ void debug_script (struct change *); #endif void perror_with_name (char const *); void pfatal_with_name (char const *) __attribute__((noreturn)); void print_script (struct change *, void (*) (struct change *)); /* flags.c */ /* This functions were added by Ivano Primi, 14-02-08 */ int init_flags (void); int print_flags (FILE* fp); flg_array copy_of_intflagtab (void); void erase_flags (void); void notedown_sdiff_script (struct change *script); /* End Section "Shared definitions coming from GNU DIFF" */ #endif /* _NUMDIFF_H_ */ numdiff-5.9.0/getopt_int.h0000644000175000017500000001127413054341114015027 0ustar paologpaolog/* Internal declarations for getopt. Copyright (C) 1989-1994,1996-1999,2001,2003,2004 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _GETOPT_INT_H #define _GETOPT_INT_H 1 extern int _getopt_internal (int ___argc, char **___argv, const char *__shortopts, const struct option *__longopts, int *__longind, int __long_only, int __posixly_correct); /* Reentrant versions which can handle parsing multiple argument vectors at the same time. */ /* Data type for reentrant functions. */ struct _getopt_data { /* These have exactly the same meaning as the corresponding global variables, except that they are used for the reentrant versions of getopt. */ int optind; int opterr; int optopt; char *optarg; /* Internal members. */ /* True if the internal members have been initialized. */ int __initialized; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ char *__nextchar; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters, or by calling getopt. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return -1 with `optind' != ARGC. */ enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } __ordering; /* If the POSIXLY_CORRECT environment variable is set or getopt was called. */ int __posixly_correct; /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ int __first_nonopt; int __last_nonopt; #if defined _LIBC && defined USE_NONOPTION_FLAGS int __nonoption_flags_max_len; int __nonoption_flags_len; # endif }; /* The initializer is necessary to set OPTIND and OPTERR to their default values and to clear the initialization flag. */ #define _GETOPT_DATA_INITIALIZER { 1, 1 } extern int _getopt_internal_r (int ___argc, char **___argv, const char *__shortopts, const struct option *__longopts, int *__longind, int __long_only, int __posixly_correct, struct _getopt_data *__data); extern int _getopt_long_r (int ___argc, char **___argv, const char *__shortopts, const struct option *__longopts, int *__longind, struct _getopt_data *__data); extern int _getopt_long_only_r (int ___argc, char **___argv, const char *__shortopts, const struct option *__longopts, int *__longind, struct _getopt_data *__data); #endif /* getopt_int.h */ numdiff-5.9.0/analyze.c0000444000175000017500000006312713054341114014313 0ustar paologpaolog/* Analyze file differences for GNU DIFF. Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU DIFF. GNU DIFF is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU DIFF is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* The basic algorithm is described in: "An O(ND) Difference Algorithm and its Variations", Eugene Myers, Algorithmica Vol. 1 No. 2, 1986, pp. 251-266; see especially section 4.2, which describes the variation used below. Unless the --minimal option is specified, this code uses the TOO_EXPENSIVE heuristic, by Paul Eggert, to limit the cost to O(N**1.5 log N) at the price of producing suboptimal output for large inputs with many differences. The basic algorithm was independently discovered as described in: "Algorithms for Approximate String Matching", E. Ukkonen, Information and Control Vol. 64, 1985, pp. 100-118. */ /* This file, coming from the source code of GNU DIFF, has been modified by Ivano Primi so that it could be merged into the source code of Numdiff. Numdiff is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. Numdiff 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. */ #include "numdiff.h" #include #include #include static lin *xvec, *yvec; /* Vectors being compared. */ static lin *fdiag; /* Vector, indexed by diagonal, containing 1 + the X coordinate of the point furthest along the given diagonal in the forward search of the edit matrix. */ static lin *bdiag; /* Vector, indexed by diagonal, containing the X coordinate of the point furthest along the given diagonal in the backward search of the edit matrix. */ static lin too_expensive; /* Edit scripts longer than this are too expensive to compute. */ #define SNAKE_LIMIT 20 /* Snakes bigger than this are considered `big'. */ struct partition { lin xmid, ymid; /* Midpoints of this partition. */ bool lo_minimal; /* Nonzero if low half will be analyzed minimally. */ bool hi_minimal; /* Likewise for high half. */ }; /* Find the midpoint of the shortest edit script for a specified portion of the two files. Scan from the beginnings of the files, and simultaneously from the ends, doing a breadth-first search through the space of edit-sequence. When the two searches meet, we have found the midpoint of the shortest edit sequence. If FIND_MINIMAL is nonzero, find the minimal edit script regardless of expense. Otherwise, if the search is too expensive, use heuristics to stop the search and report a suboptimal answer. Set PART->(xmid,ymid) to the midpoint (XMID,YMID). The diagonal number XMID - YMID equals the number of inserted lines minus the number of deleted lines (counting only lines before the midpoint). Return the approximate edit cost; this is the total number of lines inserted or deleted (counting only lines before the midpoint), unless a heuristic is used to terminate the search prematurely. Set PART->lo_minimal to true iff the minimal edit script for the left half of the partition is known; similarly for PART->hi_minimal. This function assumes that the first lines of the specified portions of the two files do not match, and likewise that the last lines do not match. The caller must trim matching lines from the beginning and end of the portions it is going to specify. If we return the "wrong" partitions, the worst this can do is cause suboptimal diff output. It cannot cause incorrect diff output. */ static lin diag (lin xoff, lin xlim, lin yoff, lin ylim, bool find_minimal, struct partition *part) { lin *const fd = fdiag; /* Give the compiler a chance. */ lin *const bd = bdiag; /* Additional help for the compiler. */ lin const *const xv = xvec; /* Still more help for the compiler. */ lin const *const yv = yvec; /* And more and more . . . */ lin const dmin = xoff - ylim; /* Minimum valid diagonal. */ lin const dmax = xlim - yoff; /* Maximum valid diagonal. */ lin const fmid = xoff - yoff; /* Center diagonal of top-down search. */ lin const bmid = xlim - ylim; /* Center diagonal of bottom-up search. */ lin fmin = fmid, fmax = fmid; /* Limits of top-down search. */ lin bmin = bmid, bmax = bmid; /* Limits of bottom-up search. */ lin c; /* Cost. */ bool odd = (fmid - bmid) & 1; /* True if southeast corner is on an odd diagonal with respect to the northwest. */ fd[fmid] = xoff; bd[bmid] = xlim; for (c = 1;; ++c) { lin d; /* Active diagonal. */ bool big_snake = 0; /* Extend the top-down search by an edit step in each diagonal. */ fmin > dmin ? fd[--fmin - 1] = -1 : ++fmin; fmax < dmax ? fd[++fmax + 1] = -1 : --fmax; for (d = fmax; d >= fmin; d -= 2) { lin x, y, oldx, tlo = fd[d - 1], thi = fd[d + 1]; if (tlo >= thi) x = tlo + 1; else x = thi; oldx = x; y = x - d; while (x < xlim && y < ylim && xv[x] == yv[y]) ++x, ++y; if (x - oldx > SNAKE_LIMIT) big_snake = 1; fd[d] = x; if (odd && bmin <= d && d <= bmax && bd[d] <= x) { part->xmid = x; part->ymid = y; part->lo_minimal = part->hi_minimal = 1; return 2 * c - 1; } } /* Similarly extend the bottom-up search. */ bmin > dmin ? bd[--bmin - 1] = LIN_MAX : ++bmin; bmax < dmax ? bd[++bmax + 1] = LIN_MAX : --bmax; for (d = bmax; d >= bmin; d -= 2) { lin x, y, oldx, tlo = bd[d - 1], thi = bd[d + 1]; if (tlo < thi) x = tlo; else x = thi - 1; oldx = x; y = x - d; while (x > xoff && y > yoff && xv[x - 1] == yv[y - 1]) --x, --y; if (oldx - x > SNAKE_LIMIT) big_snake = 1; bd[d] = x; if (!odd && fmin <= d && d <= fmax && x <= fd[d]) { part->xmid = x; part->ymid = y; part->lo_minimal = part->hi_minimal = 1; return 2 * c; } } if (find_minimal) continue; /* Heuristic: check occasionally for a diagonal that has made lots of progress compared with the edit distance. If we have any such, find the one that has made the most progress and return it as if it had succeeded. With this heuristic, for files with a constant small density of changes, the algorithm is linear in the file size. */ if (200 < c && big_snake && speed_large_files) { lin best; best = 0; for (d = fmax; d >= fmin; d -= 2) { lin dd = d - fmid; lin x = fd[d]; lin y = x - d; lin v = (x - xoff) * 2 - dd; if (v > 12 * (c + (dd < 0 ? -dd : dd))) { if (v > best && xoff + SNAKE_LIMIT <= x && x < xlim && yoff + SNAKE_LIMIT <= y && y < ylim) { /* We have a good enough best diagonal; now insist that it end with a significant snake. */ int k; for (k = 1; xv[x - k] == yv[y - k]; k++) if (k == SNAKE_LIMIT) { best = v; part->xmid = x; part->ymid = y; break; } } } } if (best > 0) { part->lo_minimal = 1; part->hi_minimal = 0; return 2 * c - 1; } best = 0; for (d = bmax; d >= bmin; d -= 2) { lin dd = d - bmid; lin x = bd[d]; lin y = x - d; lin v = (xlim - x) * 2 + dd; if (v > 12 * (c + (dd < 0 ? -dd : dd))) { if (v > best && xoff < x && x <= xlim - SNAKE_LIMIT && yoff < y && y <= ylim - SNAKE_LIMIT) { /* We have a good enough best diagonal; now insist that it end with a significant snake. */ int k; for (k = 0; xv[x + k] == yv[y + k]; k++) if (k == SNAKE_LIMIT - 1) { best = v; part->xmid = x; part->ymid = y; break; } } } } if (best > 0) { part->lo_minimal = 0; part->hi_minimal = 1; return 2 * c - 1; } } /* Heuristic: if we've gone well beyond the call of duty, give up and report halfway between our best results so far. */ if (c >= too_expensive) { lin fxybest, fxbest; lin bxybest, bxbest; fxbest = bxbest = 0; /* Pacify `gcc -Wall'. */ /* Find forward diagonal that maximizes X + Y. */ fxybest = -1; for (d = fmax; d >= fmin; d -= 2) { lin x = MIN (fd[d], xlim); lin y = x - d; if (ylim < y) x = ylim + d, y = ylim; if (fxybest < x + y) { fxybest = x + y; fxbest = x; } } /* Find backward diagonal that minimizes X + Y. */ bxybest = LIN_MAX; for (d = bmax; d >= bmin; d -= 2) { lin x = MAX (xoff, bd[d]); lin y = x - d; if (y < yoff) x = yoff + d, y = yoff; if (x + y < bxybest) { bxybest = x + y; bxbest = x; } } /* Use the better of the two diagonals. */ if ((xlim + ylim) - bxybest < fxybest - (xoff + yoff)) { part->xmid = fxbest; part->ymid = fxybest - fxbest; part->lo_minimal = 1; part->hi_minimal = 0; } else { part->xmid = bxbest; part->ymid = bxybest - bxbest; part->lo_minimal = 0; part->hi_minimal = 1; } return 2 * c - 1; } } } /* Compare in detail contiguous subsequences of the two files which are known, as a whole, to match each other. The results are recorded in the vectors files[N].changed, by storing 1 in the element for each line that is an insertion or deletion. The subsequence of file 0 is [XOFF, XLIM) and likewise for file 1. Note that XLIM, YLIM are exclusive bounds. All line numbers are origin-0 and discarded lines are not counted. If FIND_MINIMAL, find a minimal difference no matter how expensive it is. */ static void compareseq (lin xoff, lin xlim, lin yoff, lin ylim, bool find_minimal) { lin * const xv = xvec; /* Help the compiler. */ lin * const yv = yvec; /* Slide down the bottom initial diagonal. */ while (xoff < xlim && yoff < ylim && xv[xoff] == yv[yoff]) ++xoff, ++yoff; /* Slide up the top initial diagonal. */ while (xlim > xoff && ylim > yoff && xv[xlim - 1] == yv[ylim - 1]) --xlim, --ylim; /* Handle simple cases. */ if (xoff == xlim) while (yoff < ylim) files[1].changed[files[1].realindexes[yoff++]] = 1; else if (yoff == ylim) while (xoff < xlim) files[0].changed[files[0].realindexes[xoff++]] = 1; else { lin c; struct partition part; /* Find a point of correspondence in the middle of the files. */ c = diag (xoff, xlim, yoff, ylim, find_minimal, &part); if (c == 1) { /* This should be impossible, because it implies that one of the two subsequences is empty, and that case was handled above without calling `diag'. Let's verify that this is true. */ abort (); #if 0 /* The two subsequences differ by a single insert or delete; record it and we are done. */ if (part.xmid - part.ymid < xoff - yoff) files[1].changed[files[1].realindexes[part.ymid - 1]] = 1; else files[0].changed[files[0].realindexes[part.xmid]] = 1; #endif } else { /* Use the partitions to split this problem into subproblems. */ compareseq (xoff, part.xmid, yoff, part.ymid, part.lo_minimal); compareseq (part.xmid, xlim, part.ymid, ylim, part.hi_minimal); } } } /* Discard lines from one file that have no matches in the other file. A line which is discarded will not be considered by the actual comparison algorithm; it will be as if that line were not in the file. The file's `realindexes' table maps virtual line numbers (which don't count the discarded lines) into real line numbers; this is how the actual comparison algorithm produces results that are comprehensible when the discarded lines are counted. When we discard a line, we also mark it as a deletion or insertion so that it will be printed in the output. */ static void discard_confusing_lines (struct file_data filevec[], int minimal) { int f; lin i; char *discarded[2]; lin *equiv_count[2]; lin *p; /* Allocate our results. */ p = xmalloc ((filevec[0].buffered_lines + filevec[1].buffered_lines) * (2 * sizeof *p)); for (f = 0; f < 2; f++) { filevec[f].undiscarded = p; p += filevec[f].buffered_lines; filevec[f].realindexes = p; p += filevec[f].buffered_lines; } /* Set up equiv_count[F][I] as the number of lines in file F that fall in equivalence class I. */ p = zalloc (filevec[0].equiv_max * (2 * sizeof *p)); equiv_count[0] = p; equiv_count[1] = p + filevec[0].equiv_max; for (i = 0; i < filevec[0].buffered_lines; ++i) ++equiv_count[0][filevec[0].equivs[i]]; for (i = 0; i < filevec[1].buffered_lines; ++i) ++equiv_count[1][filevec[1].equivs[i]]; /* Set up tables of which lines are going to be discarded. */ discarded[0] = zalloc (filevec[0].buffered_lines + filevec[1].buffered_lines); discarded[1] = discarded[0] + filevec[0].buffered_lines; /* Mark to be discarded each line that matches no line of the other file. If a line matches many lines, mark it as provisionally discardable. */ for (f = 0; f < 2; f++) { size_t end = filevec[f].buffered_lines; char *discards = discarded[f]; lin *counts = equiv_count[1 - f]; lin *equivs = filevec[f].equivs; size_t many = 5; size_t tem = end / 64; /* Multiply MANY by approximate square root of number of lines. That is the threshold for provisionally discardable lines. */ while ((tem = tem >> 2) > 0) many *= 2; for (i = 0; i < end; i++) { lin nmatch; if (equivs[i] == 0) continue; nmatch = counts[equivs[i]]; if (nmatch == 0) discards[i] = 1; else if (nmatch > many) discards[i] = 2; } } /* Don't really discard the provisional lines except when they occur in a run of discardables, with nonprovisionals at the beginning and end. */ for (f = 0; f < 2; f++) { lin end = filevec[f].buffered_lines; register char *discards = discarded[f]; for (i = 0; i < end; i++) { /* Cancel provisional discards not in middle of run of discards. */ if (discards[i] == 2) discards[i] = 0; else if (discards[i] != 0) { /* We have found a nonprovisional discard. */ register lin j; lin length; lin provisional = 0; /* Find end of this run of discardable lines. Count how many are provisionally discardable. */ for (j = i; j < end; j++) { if (discards[j] == 0) break; if (discards[j] == 2) ++provisional; } /* Cancel provisional discards at end, and shrink the run. */ while (j > i && discards[j - 1] == 2) discards[--j] = 0, --provisional; /* Now we have the length of a run of discardable lines whose first and last are not provisional. */ length = j - i; /* If 1/4 of the lines in the run are provisional, cancel discarding of all provisional lines in the run. */ if (provisional * 4 > length) { while (j > i) if (discards[--j] == 2) discards[j] = 0; } else { register lin consec; lin minimum = 1; lin tem = length >> 2; /* MINIMUM is approximate square root of LENGTH/4. A subrun of two or more provisionals can stand when LENGTH is at least 16. A subrun of 4 or more can stand when LENGTH >= 64. */ while (0 < (tem >>= 2)) minimum <<= 1; minimum++; /* Cancel any subrun of MINIMUM or more provisionals within the larger run. */ for (j = 0, consec = 0; j < length; j++) if (discards[i + j] != 2) consec = 0; else if (minimum == ++consec) /* Back up to start of subrun, to cancel it all. */ j -= consec; else if (minimum < consec) discards[i + j] = 0; /* Scan from beginning of run until we find 3 or more nonprovisionals in a row or until the first nonprovisional at least 8 lines in. Until that point, cancel any provisionals. */ for (j = 0, consec = 0; j < length; j++) { if (j >= 8 && discards[i + j] == 1) break; if (discards[i + j] == 2) consec = 0, discards[i + j] = 0; else if (discards[i + j] == 0) consec = 0; else consec++; if (consec == 3) break; } /* I advances to the last line of the run. */ i += length - 1; /* Same thing, from end. */ for (j = 0, consec = 0; j < length; j++) { if (j >= 8 && discards[i - j] == 1) break; if (discards[i - j] == 2) consec = 0, discards[i - j] = 0; else if (discards[i - j] == 0) consec = 0; else consec++; if (consec == 3) break; } } } } } /* Actually discard the lines. */ for (f = 0; f < 2; f++) { char *discards = discarded[f]; lin end = filevec[f].buffered_lines; lin j = 0; for (i = 0; i < end; ++i) if ((minimal) || discards[i] == 0) { filevec[f].undiscarded[j] = filevec[f].equivs[i]; filevec[f].realindexes[j++] = i; } else filevec[f].changed[i] = 1; filevec[f].nondiscarded_lines = j; } free (discarded[0]); free (equiv_count[0]); } /* Adjust inserts/deletes of identical lines to join changes as much as possible. We do something when a run of changed lines include a line at one end and have an excluded, identical line at the other. We are free to choose which identical line is included. `compareseq' usually chooses the one at the beginning, but usually it is cleaner to consider the following identical line to be the "change". */ static void shift_boundaries (struct file_data filevec[]) { int f; for (f = 0; f < 2; f++) { bool *changed = filevec[f].changed; bool const *other_changed = filevec[1 - f].changed; lin const *equivs = filevec[f].equivs; lin i = 0; lin j = 0; lin i_end = filevec[f].buffered_lines; while (1) { lin runlength, start, corresponding; /* Scan forwards to find beginning of another run of changes. Also keep track of the corresponding point in the other file. */ while (i < i_end && !changed[i]) { while (other_changed[j++]) continue; i++; } if (i == i_end) break; start = i; /* Find the end of this run of changes. */ while (changed[++i]) continue; while (other_changed[j]) j++; do { /* Record the length of this run of changes, so that we can later determine whether the run has grown. */ runlength = i - start; /* Move the changed region back, so long as the previous unchanged line matches the last changed one. This merges with previous changed regions. */ while (start && equivs[start - 1] == equivs[i - 1]) { changed[--start] = 1; changed[--i] = 0; while (changed[start - 1]) start--; while (other_changed[--j]) continue; } /* Set CORRESPONDING to the end of the changed run, at the last point where it corresponds to a changed run in the other file. CORRESPONDING == I_END means no such point has been found. */ corresponding = other_changed[j - 1] ? i : i_end; /* Move the changed region forward, so long as the first changed line matches the following unchanged one. This merges with following changed regions. Do this second, so that if there are no merges, the changed region is moved forward as far as possible. */ while (i != i_end && equivs[start] == equivs[i]) { changed[start++] = 0; changed[i++] = 1; while (changed[i]) i++; while (other_changed[++j]) corresponding = i; } } while (runlength != i - start); /* If possible, move the fully-merged run of changes back to a corresponding run in the other file. */ while (corresponding < i) { changed[--start] = 1; changed[--i] = 0; while (other_changed[--j]) continue; } } } } /* Cons an additional entry onto the front of an edit script OLD. LINE0 and LINE1 are the first affected lines in the two files (origin 0). DELETED is the number of lines deleted here from file 0. INSERTED is the number of lines inserted here in file 1. If DELETED is 0 then LINE0 is the number of the line before which the insertion was done; vice versa for INSERTED and LINE1. */ static struct change * add_change (lin line0, lin line1, lin deleted, lin inserted, struct change *old) { struct change *new = xmalloc (sizeof *new); new->line0 = line0; new->line1 = line1; new->inserted = inserted; new->deleted = deleted; new->link = old; return new; } /* Scan the tables of which lines are inserted and deleted, producing an edit script in forward order. */ static struct change * build_script (struct file_data const filevec[]) { struct change *script = 0; bool *changed0 = filevec[0].changed; bool *changed1 = filevec[1].changed; lin i0 = filevec[0].buffered_lines, i1 = filevec[1].buffered_lines; /* Note that changedN[-1] does exist, and is 0. */ while (i0 >= 0 || i1 >= 0) { if (changed0[i0 - 1] | changed1[i1 - 1]) { lin line0 = i0, line1 = i1; /* Find # lines changed here in each file. */ while (changed0[i0 - 1]) --i0; while (changed1[i1 - 1]) --i1; /* Record this change. */ script = add_change (i0, i1, line0 - i0, line1 - i1, script); } /* We have reached lines in the two files that match each other. */ i0--, i1--; } return script; } /* Report the differences of two files. */ int diff_2_files (struct file_data filevec[], const argslist* argl) { lin diags; int f; struct change *e, *p; struct change *script; int changes; /* This code was just used to discover the reason of a bug :) */ /* #ifdef __USE_FILE_OFFSET64 printf ("\n %s: FILE OFFSET 64 in use, sizeof (struct stat) = %u\n", __FILE__, sizeof (struct stat)); #else printf ("\n %s: FILE OFFSET 64 NOT in use, sizeof (struct stat) = %u\n", __FILE__, sizeof (struct stat)); #endif */ /* If we have detected that either file is binary, return the error code -1. */ if (read_files (filevec, argl)) return -1; else { /* Allocate vectors for the results of comparison: a flag for each line of each file, saying whether that line is an insertion or deletion. Allocate an extra element, always 0, at each end of each vector. */ size_t s = filevec[0].buffered_lines + filevec[1].buffered_lines + 4; bool *flag_space = zalloc (s * sizeof *flag_space); filevec[0].changed = flag_space + 1; filevec[1].changed = flag_space + filevec[0].buffered_lines + 3; /* Some lines are obviously insertions or deletions because they don't match anything. Detect them now, and avoid even thinking about them in the main comparison algorithm. */ discard_confusing_lines (filevec, (getBitAtPosition (&argl->optmask, _M_MASK) == BIT_ON)); /* Now do the main comparison algorithm, considering just the undiscarded lines. */ xvec = filevec[0].undiscarded; yvec = filevec[1].undiscarded; diags = (filevec[0].nondiscarded_lines + filevec[1].nondiscarded_lines + 3); fdiag = xmalloc (diags * (2 * sizeof *fdiag)); bdiag = fdiag + diags; fdiag += filevec[1].nondiscarded_lines + 1; bdiag += filevec[1].nondiscarded_lines + 1; /* Set TOO_EXPENSIVE to be approximate square root of input size, bounded below by 256. */ too_expensive = 1; for (; diags != 0; diags >>= 2) too_expensive <<= 1; too_expensive = MAX (256, too_expensive); compareseq (0, filevec[0].nondiscarded_lines, 0, filevec[1].nondiscarded_lines, (getBitAtPosition (&argl->optmask, _M_MASK) == BIT_ON)); free (fdiag - (filevec[1].nondiscarded_lines + 1)); /* Modify the results slightly to make them prettier in cases where that can validly be done. */ shift_boundaries (filevec); /* Get the results of comparison in the form of a chain of `struct change's -- an edit script. */ script = build_script (filevec); /* Set CHANGES if we had any diffs. */ changes = (script != 0) ? 1 : 0; if ( getBitAtPosition (&argl->optmask, _F_MASK) == BIT_ON && argl->output_mode > OUTMODE_QUIET ) { if (changes | !suppress_common_lines) print_sdiff_script (script); } else { if (changes | !suppress_common_lines) notedown_sdiff_script (script); } free (filevec[0].undiscarded); free (flag_space); for (f = 0; f < 2; f++) { free (filevec[f].equivs); free (filevec[f].linbuf + filevec[f].linbuf_base); } for (e = script; e; e = p) { p = e->link; free (e); } } if (filevec[0].buffer != filevec[1].buffer) free (filevec[0].buffer); free (filevec[1].buffer); return changes; } numdiff-5.9.0/error.h0000644000175000017500000000465713054341114014013 0ustar paologpaolog/* Declaration for error-reporting function Copyright (C) 1995, 1996, 1997, 2003, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _ERROR_H #define _ERROR_H 1 #ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ # define __attribute__(Spec) /* empty */ # endif /* The __-protected variants of `format' and `printf' attributes are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) # define __format__ format # define __printf__ printf # endif #endif #ifdef __cplusplus extern "C" { #endif /* Print a message with `fprintf (stderr, FORMAT, ...)'; if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM). If STATUS is nonzero, terminate the program with `exit (STATUS)'. */ extern void error (int __status, int __errnum, const char *__format, ...) __attribute__ ((__format__ (__printf__, 3, 4))); extern void error_at_line (int __status, int __errnum, const char *__fname, unsigned int __lineno, const char *__format, ...) __attribute__ ((__format__ (__printf__, 5, 6))); /* If NULL, error will flush stdout, then print on stderr the program name, a colon and a space. Otherwise, error will call this function without parameters instead. */ extern void (*error_print_progname) (void); /* This variable is incremented each time `error' is called. */ extern unsigned int error_message_count; /* Sometimes we want to have at most one error per line. This variable controls whether this mode is selected or not. */ extern int error_one_per_line; #ifdef __cplusplus } #endif #endif /* error.h */ numdiff-5.9.0/xalloc-die.c0000644000175000017500000000254313054341114014666 0ustar paologpaolog/* Report a memory allocation failure and exit. Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "xalloc.h" #include #include "error.h" #include "exitfail.h" #include "gettext.h" #define _(msgid) gettext (msgid) void xalloc_die (void) { error (exit_failure, 0, "%s", _("memory exhausted")); /* The `noreturn' cannot be given to error, since it may return if its first argument is 0. To help compilers understand the xalloc_die does not return, call abort. Also, the abort is a safety feature if exit_failure is 0 (which shouldn't happen). */ abort (); } numdiff-5.9.0/number.c0000444000175000017500000012437413054341114014142 0ustar paologpaolog/* number.c: Implements arbitrary precision numbers. */ /* Copyright (C) 1991, 1992, 1993, 1994, 1997, 2000 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to: The Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA You may contact the author by: e-mail: philnelson@acm.org us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ /* This file, coming from the source code of GNU BC, has been modified by Ivano Primi so that it could be merged into the source code of Numdiff. Numdiff is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. Numdiff 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. */ #include /* #include */ #include #include #ifdef __STDC__ #include #endif /* #include */ #include "numdiff.h" #include "number.h" /* Prototypes needed for external utility routines. */ #ifdef _DMALLOC_ #include /* Useful only for the debugging */ #endif #define bc_rt_warn rt_warn #define bc_rt_error rt_error #define bc_out_of_memory out_of_memory _PROTOTYPE(void rt_warn, (char *mesg ,...)); _PROTOTYPE(void rt_error, (char *mesg ,...)); _PROTOTYPE(void out_of_memory, (void)); /* Storage used for special numbers. */ bc_num _zero_; bc_num _one_; bc_num _two_; static bc_num _bc_Free_list = NULL; /* new_num allocates a number and sets fields to known values. */ bc_num bc_new_num (length, scale) int length, scale; { bc_num temp; if (_bc_Free_list != NULL) { temp = _bc_Free_list; _bc_Free_list = temp->n_next; } else { temp = (bc_num) malloc (sizeof(bc_struct)); if (temp == NULL) bc_out_of_memory (); } temp->n_sign = PLUS; temp->n_len = length; temp->n_scale = scale; temp->n_refs = 1; temp->n_ptr = (char *) malloc (length+scale); if (temp->n_ptr == NULL) bc_out_of_memory(); temp->n_value = temp->n_ptr; memset (temp->n_ptr, 0, length+scale); return temp; } /* "Frees" a bc_num NUM. Actually decreases reference count and only frees the storage if reference count is zero. */ void bc_free_num (num) bc_num *num; { if (*num == NULL) return; (*num)->n_refs--; if ((*num)->n_refs == 0) { if ((*num)->n_ptr) free ((*num)->n_ptr); (*num)->n_next = _bc_Free_list; _bc_Free_list = *num; } *num = NULL; } /* Initialize the number package! */ void bc_init_numbers () { _zero_ = bc_new_num (1,0); _one_ = bc_new_num (1,0); _one_->n_value[0] = 1; _two_ = bc_new_num (1,0); _two_->n_value[0] = 2; } /* Free the memory associated to _two_, _one_ and _zero_ . */ void bc_end () { bc_free_num (&_two_); bc_free_num (&_one_); bc_free_num (&_zero_); } /* This routine has been added by Ivano Primi to avoid some memory leaks. */ /* 30/12/2002 */ /* Make a copy of a number! Just increments the reference count! */ bc_num bc_copy_num (num) bc_num num; { num->n_refs++; return num; } /* Initialize a number NUM by making it a copy of zero. */ void bc_init_num (num) bc_num *num; { *num = bc_copy_num (_zero_); } /* For many things, we may have leading zeros in a number NUM. _bc_rm_leading_zeros just moves the data "value" pointer to the correct place and adjusts the length. */ static void _bc_rm_leading_zeros (num) bc_num num; { /* We can move n_value to point to the first non zero digit! */ while (*num->n_value == 0 && num->n_len > 1) { num->n_value++; num->n_len--; } } /* Compare two bc numbers. Return value is 0 if equal, -1 if N1 is less than N2 and +1 if N1 is greater than N2. If USE_SIGN is false, just compare the magnitudes. */ static int _bc_do_compare (n1, n2, use_sign, ignore_last) bc_num n1, n2; int use_sign; int ignore_last; { char *n1ptr, *n2ptr; int count; /* First, compare signs. */ if (use_sign && n1->n_sign != n2->n_sign) { if (n1->n_sign == PLUS) return (1); /* Positive N1 > Negative N2 */ else return (-1); /* Negative N1 < Positive N1 */ } /* Now compare the magnitude. */ if (n1->n_len != n2->n_len) { if (n1->n_len > n2->n_len) { /* Magnitude of n1 > n2. */ if (!use_sign || n1->n_sign == PLUS) return (1); else return (-1); } else { /* Magnitude of n1 < n2. */ if (!use_sign || n1->n_sign == PLUS) return (-1); else return (1); } } /* If we get here, they have the same number of integer digits. check the integer part and the equal length part of the fraction. */ count = n1->n_len + MIN (n1->n_scale, n2->n_scale); n1ptr = n1->n_value; n2ptr = n2->n_value; while ((count > 0) && (*n1ptr == *n2ptr)) { n1ptr++; n2ptr++; count--; } if (ignore_last && count == 1 && n1->n_scale == n2->n_scale) return (0); if (count != 0) { if (*n1ptr > *n2ptr) { /* Magnitude of n1 > n2. */ if (!use_sign || n1->n_sign == PLUS) return (1); else return (-1); } else { /* Magnitude of n1 < n2. */ if (!use_sign || n1->n_sign == PLUS) return (-1); else return (1); } } /* They are equal up to the last part of the equal part of the fraction. */ if (n1->n_scale != n2->n_scale) { if (n1->n_scale > n2->n_scale) { for (count = n1->n_scale-n2->n_scale; count>0; count--) if (*n1ptr++ != 0) { /* Magnitude of n1 > n2. */ if (!use_sign || n1->n_sign == PLUS) return (1); else return (-1); } } else { for (count = n2->n_scale-n1->n_scale; count>0; count--) if (*n2ptr++ != 0) { /* Magnitude of n1 < n2. */ if (!use_sign || n1->n_sign == PLUS) return (-1); else return (1); } } } /* They must be equal! */ return (0); } /* This is the "user callable" routine to compare numbers N1 and N2. */ int bc_compare (n1, n2) bc_num n1, n2; { return _bc_do_compare (n1, n2, TRUE, FALSE); } /* In some places we need to check if the number is negative. */ char bc_is_neg (num) bc_num num; { return num->n_sign == MINUS; } /* In some places we need to check if the number NUM is zero. */ char bc_is_zero (num) bc_num num; { int count; char *nptr; /* Quick check. */ if (num == _zero_) return TRUE; /* Initialize */ count = num->n_len + num->n_scale; nptr = num->n_value; /* The check */ while ((count > 0) && (*nptr++ == 0)) count--; if (count != 0) return FALSE; else return TRUE; } /* In some places we need to check if the number NUM is almost zero. Specifically, all but the last digit is 0 and the last digit is 1. Last digit is defined by scale. */ char bc_is_near_zero (num, scale) bc_num num; int scale; { int count; char *nptr; /* Error checking */ if (scale > num->n_scale) scale = num->n_scale; /* Initialize */ count = num->n_len + scale; nptr = num->n_value; /* The check */ while ((count > 0) && (*nptr++ == 0)) count--; if (count != 0 && (count != 1 || *--nptr != 1)) return FALSE; else return TRUE; } /* Perform addition: N1 is added to N2 and the value is returned. The signs of N1 and N2 are ignored. SCALE_MIN is to set the minimum scale of the result. */ static bc_num _bc_do_add (n1, n2, scale_min) bc_num n1, n2; int scale_min; { bc_num sum; int sum_scale, sum_digits; char *n1ptr, *n2ptr, *sumptr; int carry, n1bytes, n2bytes; int count; /* Prepare sum. */ sum_scale = MAX (n1->n_scale, n2->n_scale); sum_digits = MAX (n1->n_len, n2->n_len) + 1; sum = bc_new_num (sum_digits, MAX(sum_scale, scale_min)); /* Zero extra digits made by scale_min. */ if (scale_min > sum_scale) { sumptr = (char *) (sum->n_value + sum_scale + sum_digits); for (count = scale_min - sum_scale; count > 0; count--) *sumptr++ = 0; } /* Start with the fraction part. Initialize the pointers. */ n1bytes = n1->n_scale; n2bytes = n2->n_scale; n1ptr = (char *) (n1->n_value + n1->n_len + n1bytes - 1); n2ptr = (char *) (n2->n_value + n2->n_len + n2bytes - 1); sumptr = (char *) (sum->n_value + sum_scale + sum_digits - 1); /* Add the fraction part. First copy the longer fraction.*/ if (n1bytes != n2bytes) { if (n1bytes > n2bytes) while (n1bytes>n2bytes) { *sumptr-- = *n1ptr--; n1bytes--;} else while (n2bytes>n1bytes) { *sumptr-- = *n2ptr--; n2bytes--;} } /* Now add the remaining fraction part and equal size integer parts. */ n1bytes += n1->n_len; n2bytes += n2->n_len; carry = 0; while ((n1bytes > 0) && (n2bytes > 0)) { *sumptr = *n1ptr-- + *n2ptr-- + carry; if (*sumptr > (BASE-1)) { carry = 1; *sumptr -= BASE; } else carry = 0; sumptr--; n1bytes--; n2bytes--; } /* Now add carry the longer integer part. */ if (n1bytes == 0) { n1bytes = n2bytes; n1ptr = n2ptr; } while (n1bytes-- > 0) { *sumptr = *n1ptr-- + carry; if (*sumptr > (BASE-1)) { carry = 1; *sumptr -= BASE; } else carry = 0; sumptr--; } /* Set final carry. */ if (carry == 1) *sumptr += 1; /* Adjust sum and return. */ _bc_rm_leading_zeros (sum); return sum; } /* Perform subtraction: N2 is subtracted from N1 and the value is returned. The signs of N1 and N2 are ignored. Also, N1 is assumed to be larger than N2. SCALE_MIN is the minimum scale of the result. */ static bc_num _bc_do_sub (n1, n2, scale_min) bc_num n1, n2; int scale_min; { bc_num diff; int diff_scale, diff_len; int min_scale, min_len; char *n1ptr, *n2ptr, *diffptr; int borrow, count, val; /* Allocate temporary storage. */ diff_len = MAX (n1->n_len, n2->n_len); diff_scale = MAX (n1->n_scale, n2->n_scale); min_len = MIN (n1->n_len, n2->n_len); min_scale = MIN (n1->n_scale, n2->n_scale); diff = bc_new_num (diff_len, MAX(diff_scale, scale_min)); /* Zero extra digits made by scale_min. */ if (scale_min > diff_scale) { diffptr = (char *) (diff->n_value + diff_len + diff_scale); for (count = scale_min - diff_scale; count > 0; count--) *diffptr++ = 0; } /* Initialize the subtract. */ n1ptr = (char *) (n1->n_value + n1->n_len + n1->n_scale -1); n2ptr = (char *) (n2->n_value + n2->n_len + n2->n_scale -1); diffptr = (char *) (diff->n_value + diff_len + diff_scale -1); /* Subtract the numbers. */ borrow = 0; /* Take care of the longer scaled number. */ if (n1->n_scale != min_scale) { /* n1 has the longer scale */ for (count = n1->n_scale - min_scale; count > 0; count--) *diffptr-- = *n1ptr--; } else { /* n2 has the longer scale */ for (count = n2->n_scale - min_scale; count > 0; count--) { val = - *n2ptr-- - borrow; if (val < 0) { val += BASE; borrow = 1; } else borrow = 0; *diffptr-- = val; } } /* Now do the equal length scale and integer parts. */ for (count = 0; count < min_len + min_scale; count++) { val = *n1ptr-- - *n2ptr-- - borrow; if (val < 0) { val += BASE; borrow = 1; } else borrow = 0; *diffptr-- = val; } /* If n1 has more digits then n2, we now do that subtract. */ if (diff_len != min_len) { for (count = diff_len - min_len; count > 0; count--) { val = *n1ptr-- - borrow; if (val < 0) { val += BASE; borrow = 1; } else borrow = 0; *diffptr-- = val; } } /* Clean up and return. */ _bc_rm_leading_zeros (diff); return diff; } /* Here is the full subtract routine that takes care of negative numbers. N2 is subtracted from N1 and the result placed in RESULT. SCALE_MIN is the minimum scale for the result. */ void bc_sub (n1, n2, result, scale_min) bc_num n1, n2, *result; int scale_min; { bc_num diff = NULL; int cmp_res; int res_scale; if (n1->n_sign != n2->n_sign) { diff = _bc_do_add (n1, n2, scale_min); diff->n_sign = n1->n_sign; } else { /* subtraction must be done. */ /* Compare magnitudes. */ cmp_res = _bc_do_compare (n1, n2, FALSE, FALSE); switch (cmp_res) { case -1: /* n1 is less than n2, subtract n1 from n2. */ diff = _bc_do_sub (n2, n1, scale_min); diff->n_sign = (n2->n_sign == PLUS ? MINUS : PLUS); break; case 0: /* They are equal! return zero! */ res_scale = MAX (scale_min, MAX(n1->n_scale, n2->n_scale)); diff = bc_new_num (1, res_scale); memset (diff->n_value, 0, res_scale+1); break; case 1: /* n2 is less than n1, subtract n2 from n1. */ diff = _bc_do_sub (n1, n2, scale_min); diff->n_sign = n1->n_sign; break; } } /* Clean up and return. */ bc_free_num (result); *result = diff; } /* Here is the full add routine that takes care of negative numbers. N1 is added to N2 and the result placed into RESULT. SCALE_MIN is the minimum scale for the result. */ void bc_add (n1, n2, result, scale_min) bc_num n1, n2, *result; int scale_min; { bc_num sum = NULL; int cmp_res; int res_scale; if (n1->n_sign == n2->n_sign) { sum = _bc_do_add (n1, n2, scale_min); sum->n_sign = n1->n_sign; } else { /* subtraction must be done. */ cmp_res = _bc_do_compare (n1, n2, FALSE, FALSE); /* Compare magnitudes. */ switch (cmp_res) { case -1: /* n1 is less than n2, subtract n1 from n2. */ sum = _bc_do_sub (n2, n1, scale_min); sum->n_sign = n2->n_sign; break; case 0: /* They are equal! return zero with the correct scale! */ res_scale = MAX (scale_min, MAX(n1->n_scale, n2->n_scale)); sum = bc_new_num (1, res_scale); memset (sum->n_value, 0, res_scale+1); break; case 1: /* n2 is less than n1, subtract n2 from n1. */ sum = _bc_do_sub (n1, n2, scale_min); sum->n_sign = n1->n_sign; } } /* Clean up and return. */ bc_free_num (result); *result = sum; } /* Recursive vs non-recursive multiply crossover ranges. */ #if defined(MULDIGITS) #include "muldigits.h" #else #define MUL_BASE_DIGITS 80 #endif int mul_base_digits = MUL_BASE_DIGITS; #define MUL_SMALL_DIGITS mul_base_digits/4 /* Multiply utility routines */ static bc_num new_sub_num (length, scale, value) int length, scale; char *value; { bc_num temp; if (_bc_Free_list != NULL) { temp = _bc_Free_list; _bc_Free_list = temp->n_next; } else { temp = (bc_num) malloc (sizeof(bc_struct)); if (temp == NULL) bc_out_of_memory (); } temp->n_sign = PLUS; temp->n_len = length; temp->n_scale = scale; temp->n_refs = 1; temp->n_ptr = NULL; temp->n_value = value; return temp; } static void _bc_simp_mul (bc_num n1, int n1len, bc_num n2, int n2len, bc_num *prod, int full_scale) { char *n1ptr, *n2ptr, *pvptr; char *n1end, *n2end; /* To the end of n1 and n2. */ int indx, sum, prodlen; prodlen = n1len+n2len+1; *prod = bc_new_num (prodlen, 0); n1end = (char *) (n1->n_value + n1len - 1); n2end = (char *) (n2->n_value + n2len - 1); pvptr = (char *) ((*prod)->n_value + prodlen - 1); sum = 0; /* Here is the loop... */ for (indx = 0; indx < prodlen-1; indx++) { n1ptr = (char *) (n1end - MAX(0, indx-n2len+1)); n2ptr = (char *) (n2end - MIN(indx, n2len-1)); while ((n1ptr >= n1->n_value) && (n2ptr <= n2end)) sum += *n1ptr-- * *n2ptr++; *pvptr-- = sum % BASE; sum = sum / BASE; } *pvptr = sum; } /* A special adder/subtractor for the recursive divide and conquer multiply algorithm. Note: if sub is called, accum must be larger that what is being subtracted. Also, accum and val must have n_scale = 0. (e.g. they must look like integers. *) */ static void _bc_shift_addsub (bc_num accum, bc_num val, int shift, int sub) { signed char *accp, *valp; int count, carry; count = val->n_len; if (val->n_value[0] == 0) count--; assert (accum->n_len+accum->n_scale >= shift+count); /* Set up pointers and others */ accp = (signed char *)(accum->n_value + accum->n_len + accum->n_scale - shift - 1); valp = (signed char *)(val->n_value + val->n_len - 1); carry = 0; if (sub) { /* Subtraction, carry is really borrow. */ while (count--) { *accp -= *valp-- + carry; if (*accp < 0) { carry = 1; *accp-- += BASE; } else { carry = 0; accp--; } } while (carry) { *accp -= carry; if (*accp < 0) *accp-- += BASE; else carry = 0; } } else { /* Addition */ while (count--) { *accp += *valp-- + carry; if (*accp > (BASE-1)) { carry = 1; *accp-- -= BASE; } else { carry = 0; accp--; } } while (carry) { *accp += carry; if (*accp > (BASE-1)) *accp-- -= BASE; else carry = 0; } } } /* Recursive divide and conquer multiply algorithm. Based on Let u = u0 + u1*(b^n) Let v = v0 + v1*(b^n) Then uv = (B^2n+B^n)*u1*v1 + B^n*(u1-u0)*(v0-v1) + (B^n+1)*u0*v0 B is the base of storage, number of digits in u1,u0 close to equal. */ static void _bc_rec_mul (bc_num u, int ulen, bc_num v, int vlen, bc_num *prod, int full_scale) { bc_num u0, u1, v0, v1; int u0len, v0len; bc_num m1, m2, m3, d1, d2; int n, prodlen, m1zero; int d1len, d2len; /* Base case? */ if ((ulen+vlen) < mul_base_digits || ulen < MUL_SMALL_DIGITS || vlen < MUL_SMALL_DIGITS ) { _bc_simp_mul (u, ulen, v, vlen, prod, full_scale); return; } /* Calculate n -- the u and v split point in digits. */ n = (MAX(ulen, vlen)+1) / 2; /* Split u and v. */ if (ulen < n) { u1 = bc_copy_num (_zero_); u0 = new_sub_num (ulen,0, u->n_value); } else { u1 = new_sub_num (ulen-n, 0, u->n_value); u0 = new_sub_num (n, 0, u->n_value+ulen-n); } if (vlen < n) { v1 = bc_copy_num (_zero_); v0 = new_sub_num (vlen,0, v->n_value); } else { v1 = new_sub_num (vlen-n, 0, v->n_value); v0 = new_sub_num (n, 0, v->n_value+vlen-n); } _bc_rm_leading_zeros (u1); _bc_rm_leading_zeros (u0); u0len = u0->n_len; _bc_rm_leading_zeros (v1); _bc_rm_leading_zeros (v0); v0len = v0->n_len; m1zero = bc_is_zero(u1) || bc_is_zero(v1); /* Calculate sub results ... */ bc_init_num(&d1); bc_init_num(&d2); bc_sub (u1, u0, &d1, 0); d1len = d1->n_len; bc_sub (v0, v1, &d2, 0); d2len = d2->n_len; /* Do recursive multiplies and shifted adds. */ if (m1zero) m1 = bc_copy_num (_zero_); else _bc_rec_mul (u1, u1->n_len, v1, v1->n_len, &m1, 0); if (bc_is_zero(d1) || bc_is_zero(d2)) m2 = bc_copy_num (_zero_); else _bc_rec_mul (d1, d1len, d2, d2len, &m2, 0); if (bc_is_zero(u0) || bc_is_zero(v0)) m3 = bc_copy_num (_zero_); else _bc_rec_mul (u0, u0->n_len, v0, v0->n_len, &m3, 0); /* Initialize product */ prodlen = ulen+vlen+1; *prod = bc_new_num(prodlen, 0); if (!m1zero) { _bc_shift_addsub (*prod, m1, 2*n, 0); _bc_shift_addsub (*prod, m1, n, 0); } _bc_shift_addsub (*prod, m3, n, 0); _bc_shift_addsub (*prod, m3, 0, 0); _bc_shift_addsub (*prod, m2, n, d1->n_sign != d2->n_sign); /* Now clean up! */ bc_free_num (&u1); bc_free_num (&u0); bc_free_num (&v1); bc_free_num (&m1); bc_free_num (&v0); bc_free_num (&m2); bc_free_num (&m3); bc_free_num (&d1); bc_free_num (&d2); } /* The multiply routine. N2 times N1 is put int PROD with the scale of the result being MIN(N2 scale+N1 scale, MAX (SCALE, N2 scale, N1 scale)). */ void bc_multiply (n1, n2, prod, scale) bc_num n1, n2, *prod; int scale; { bc_num pval; int len1, len2; int full_scale, prod_scale; /* Initialize things. */ len1 = n1->n_len + n1->n_scale; len2 = n2->n_len + n2->n_scale; full_scale = n1->n_scale + n2->n_scale; prod_scale = MIN(full_scale,MAX(scale,MAX(n1->n_scale,n2->n_scale))); /* Do the multiply */ _bc_rec_mul (n1, len1, n2, len2, &pval, full_scale); /* Assign to prod and clean up the number. */ pval->n_sign = ( n1->n_sign == n2->n_sign ? PLUS : MINUS ); pval->n_value = pval->n_ptr; pval->n_len = len2 + len1 + 1 - full_scale; pval->n_scale = prod_scale; _bc_rm_leading_zeros (pval); if (bc_is_zero (pval)) pval->n_sign = PLUS; bc_free_num (prod); *prod = pval; } /* Some utility routines for the divide: First a one digit multiply. NUM (with SIZE digits) is multiplied by DIGIT and the result is placed into RESULT. It is written so that NUM and RESULT can be the same pointers. */ static void _one_mult (num, size, digit, result) unsigned char *num; int size, digit; unsigned char *result; { int carry, value; unsigned char *nptr, *rptr; if (digit == 0) memset (result, 0, size); else { if (digit == 1) memcpy (result, num, size); else { /* Initialize */ nptr = (unsigned char *) (num+size-1); rptr = (unsigned char *) (result+size-1); carry = 0; while (size-- > 0) { value = *nptr-- * digit + carry; *rptr-- = value % BASE; carry = value / BASE; } if (carry != 0) *rptr = carry; } } } /* The full division routine. This computes N1 / N2. It returns 0 if the division is ok and the result is in QUOT. The number of digits after the decimal point is SCALE. It returns -1 if division by zero is tried. The algorithm is found in Knuth Vol 2. p237. */ int bc_divide (n1, n2, quot, scale) bc_num n1, n2, *quot; int scale; { bc_num qval; unsigned char *num1, *num2; unsigned char *ptr1, *ptr2, *n2ptr, *qptr; int scale1, val; unsigned int len1, len2, scale2, qdigits, extra, count; unsigned int qdig, qguess, borrow, carry; unsigned char *mval; char zero; unsigned int norm; /* Test for divide by zero. */ if (bc_is_zero (n2)) return -1; /* Test for divide by 1. If it is we must truncate. */ if (n2->n_scale == 0) { if (n2->n_len == 1 && *n2->n_value == 1) { qval = bc_new_num (n1->n_len, scale); qval->n_sign = (n1->n_sign == n2->n_sign ? PLUS : MINUS); memset (&qval->n_value[n1->n_len],0,scale); memcpy (qval->n_value, n1->n_value, n1->n_len + MIN(n1->n_scale,scale)); bc_free_num (quot); *quot = qval; } } /* Set up the divide. Move the decimal point on n1 by n2's scale. Remember, zeros on the end of num2 are wasted effort for dividing. */ scale2 = n2->n_scale; n2ptr = (unsigned char *) n2->n_value+n2->n_len+scale2-1; while ((scale2 > 0) && (*n2ptr-- == 0)) scale2--; len1 = n1->n_len + scale2; scale1 = n1->n_scale - scale2; if (scale1 < scale) extra = scale - scale1; else extra = 0; num1 = (unsigned char *) malloc (n1->n_len+n1->n_scale+extra+2); if (num1 == NULL) bc_out_of_memory(); memset (num1, 0, n1->n_len+n1->n_scale+extra+2); memcpy (num1+1, n1->n_value, n1->n_len+n1->n_scale); len2 = n2->n_len + scale2; num2 = (unsigned char *) malloc (len2+1); if (num2 == NULL) bc_out_of_memory(); memcpy (num2, n2->n_value, len2); *(num2+len2) = 0; n2ptr = num2; while (*n2ptr == 0) { n2ptr++; len2--; } /* Calculate the number of quotient digits. */ if (len2 > len1+scale) { qdigits = scale+1; zero = TRUE; } else { zero = FALSE; if (len2>len1) qdigits = scale+1; /* One for the zero integer part. */ else qdigits = len1-len2+scale+1; } /* Allocate and zero the storage for the quotient. */ qval = bc_new_num (qdigits-scale,scale); memset (qval->n_value, 0, qdigits); /* Allocate storage for the temporary storage mval. */ mval = (unsigned char *) malloc (len2+1); if (mval == NULL) bc_out_of_memory (); /* Now for the full divide algorithm. */ if (!zero) { /* Normalize */ norm = 10 / ((int)*n2ptr + 1); if (norm != 1) { _one_mult (num1, len1+scale1+extra+1, norm, num1); _one_mult (n2ptr, len2, norm, n2ptr); } /* Initialize divide loop. */ qdig = 0; if (len2 > len1) qptr = (unsigned char *) qval->n_value+len2-len1; else qptr = (unsigned char *) qval->n_value; /* Loop */ while (qdig <= len1+scale-len2) { /* Calculate the quotient digit guess. */ if (*n2ptr == num1[qdig]) qguess = 9; else qguess = (num1[qdig]*10 + num1[qdig+1]) / *n2ptr; /* Test qguess. */ if (n2ptr[1]*qguess > (num1[qdig]*10 + num1[qdig+1] - *n2ptr*qguess)*10 + num1[qdig+2]) { qguess--; /* And again. */ if (n2ptr[1]*qguess > (num1[qdig]*10 + num1[qdig+1] - *n2ptr*qguess)*10 + num1[qdig+2]) qguess--; } /* Multiply and subtract. */ borrow = 0; if (qguess != 0) { *mval = 0; _one_mult (n2ptr, len2, qguess, mval+1); ptr1 = (unsigned char *) num1+qdig+len2; ptr2 = (unsigned char *) mval+len2; for (count = 0; count < len2+1; count++) { val = (int) *ptr1 - (int) *ptr2-- - borrow; if (val < 0) { val += 10; borrow = 1; } else borrow = 0; *ptr1-- = val; } } /* Test for negative result. */ if (borrow == 1) { qguess--; ptr1 = (unsigned char *) num1+qdig+len2; ptr2 = (unsigned char *) n2ptr+len2-1; carry = 0; for (count = 0; count < len2; count++) { val = (int) *ptr1 + (int) *ptr2-- + carry; if (val > 9) { val -= 10; carry = 1; } else carry = 0; *ptr1-- = val; } if (carry == 1) *ptr1 = (*ptr1 + 1) % 10; } /* We now know the quotient digit. */ *qptr++ = qguess; qdig++; } } /* Clean up and return the number. */ qval->n_sign = ( n1->n_sign == n2->n_sign ? PLUS : MINUS ); if (bc_is_zero (qval)) qval->n_sign = PLUS; _bc_rm_leading_zeros (qval); bc_free_num (quot); *quot = qval; /* Clean up temporary storage. */ free (mval); free (num1); free (num2); return 0; /* Everything is OK. */ } /* Division *and* modulo for numbers. This computes both NUM1 / NUM2 and NUM1 % NUM2 and puts the results in QUOT and REM, except that if QUOT is NULL then that store will be omitted. */ int bc_divmod (num1, num2, quot, rem, scale) bc_num num1, num2, *quot, *rem; int scale; { bc_num quotient = NULL; bc_num temp; int rscale; /* Check for correct numbers. */ if (bc_is_zero (num2)) return -1; /* Calculate final scale. */ rscale = MAX (num1->n_scale, num2->n_scale+scale); bc_init_num(&temp); /* Calculate it. */ bc_divide (num1, num2, &temp, scale); if (quot) quotient = bc_copy_num (temp); bc_multiply (temp, num2, &temp, rscale); bc_sub (num1, temp, rem, rscale); bc_free_num (&temp); if (quot) { bc_free_num (quot); *quot = quotient; } return 0; /* Everything is OK. */ } /* Modulo for numbers. This computes NUM1 % NUM2 and puts the result in RESULT. */ int bc_modulo (num1, num2, result, scale) bc_num num1, num2, *result; int scale; { return bc_divmod (num1, num2, NULL, result, scale); } /* Raise BASE to the EXPO power, reduced modulo MOD. The result is placed in RESULT. If a EXPO is not an integer, only the integer part is used. */ int bc_raisemod (base, expo, mod, result, scale) bc_num base, expo, mod, *result; int scale; { bc_num power, exponent, parity, temp; int rscale; /* Check for correct numbers. */ if (bc_is_zero(mod)) return -1; if (bc_is_neg(expo)) return -1; /* Set initial values. */ power = bc_copy_num (base); exponent = bc_copy_num (expo); temp = bc_copy_num (_one_); bc_init_num(&parity); /* Check the base for scale digits. */ if (base->n_scale != 0) bc_rt_warn (_("power with non integral base")); /* bc_rt_warn (_("non-zero scale in base")); */ /* Check the exponent for scale digits. */ if (exponent->n_scale != 0) { bc_rt_warn (_("power with non integral exponent")); /* bc_rt_warn (_("non-zero scale in exponent")); */ bc_divide (exponent, _one_, &exponent, 0); /*truncate */ } /* Check the modulus for scale digits. */ if (mod->n_scale != 0) bc_rt_warn (_("modulus is not an integral value")); /* bc_rt_warn (_("non-zero scale in modulus")); */ /* Do the calculation. */ rscale = MAX(scale, base->n_scale); while ( !bc_is_zero(exponent) ) { (void) bc_divmod (exponent, _two_, &exponent, &parity, 0); if ( !bc_is_zero(parity) ) { bc_multiply (temp, power, &temp, rscale); (void) bc_modulo (temp, mod, &temp, scale); } bc_multiply (power, power, &power, rscale); (void) bc_modulo (power, mod, &power, scale); } /* Assign the value. */ bc_free_num (&power); bc_free_num (&exponent); bc_free_num (result); *result = temp; return 0; /* Everything is OK. */ } /* Raise NUM1 to the NUM2 power. The result is placed in RESULT. Maximum exponent is LONG_MAX. If a NUM2 is not an integer, only the integer part is used. */ void bc_raise (num1, num2, result, scale) bc_num num1, num2, *result; int scale; { bc_num temp, power; long exponent; int rscale; int pwrscale; int calcscale; char neg; /* Check the exponent for scale digits and convert to a long. */ if (num2->n_scale != 0) bc_rt_warn (_("power with non integral exponent")); /* bc_rt_warn (_("non-zero scale in exponent")); */ exponent = bc_num2long (num2); if (exponent == 0 && (num2->n_len > 1 || num2->n_value[0] != 0)) bc_rt_error (_("exponent too large in raise")); /* Special case if exponent is a zero. */ if (exponent == 0) { bc_free_num (result); *result = bc_copy_num (_one_); return; } /* Other initializations. */ if (exponent < 0) { neg = TRUE; exponent = -exponent; rscale = scale; } else { neg = FALSE; rscale = MIN (num1->n_scale*exponent, MAX(scale, num1->n_scale)); } /* Set initial value of temp. */ power = bc_copy_num (num1); pwrscale = num1->n_scale; while ((exponent & 1) == 0) { pwrscale = 2*pwrscale; bc_multiply (power, power, &power, pwrscale); exponent = exponent >> 1; } temp = bc_copy_num (power); calcscale = pwrscale; exponent = exponent >> 1; /* Do the calculation. */ while (exponent > 0) { pwrscale = 2*pwrscale; bc_multiply (power, power, &power, pwrscale); if ((exponent & 1) == 1) { calcscale = pwrscale + calcscale; bc_multiply (temp, power, &temp, calcscale); } exponent = exponent >> 1; } /* Assign the value. */ if (neg) { bc_divide (_one_, temp, result, rscale); bc_free_num (&temp); } else { bc_free_num (result); *result = temp; if ((*result)->n_scale > rscale) (*result)->n_scale = rscale; } bc_free_num (&power); } /* Take the square root NUM and return it in NUM with SCALE digits after the decimal place. */ int bc_sqrt (num, scale) bc_num *num; int scale; { int rscale, cmp_res, done; int cscale; bc_num guess, guess1, point5, diff; /* Initial checks. */ cmp_res = bc_compare (*num, _zero_); if (cmp_res < 0) return -1; /* error */ else { if (cmp_res == 0) { bc_free_num (num); *num = bc_copy_num (_zero_); return 0; } } cmp_res = bc_compare (*num, _one_); if (cmp_res == 0) { bc_free_num (num); *num = bc_copy_num (_one_); return 0; } /* Initialize the variables. */ rscale = MAX (scale, (*num)->n_scale); /* bc_init_num(&guess); */ /* Moved at the line 1386 by Ivano Primi */ bc_init_num(&guess1); bc_init_num(&diff); point5 = bc_new_num (1,1); point5->n_value[1] = 5; /* Calculate the initial guess. */ if (cmp_res < 0) { /* The number is between 0 and 1. Guess should start at 1. */ guess = bc_copy_num (_one_); cscale = (*num)->n_scale; } else { /* The number is greater than 1. Guess should start at 10^(exp/2). */ bc_init_num(&guess); bc_int2num (&guess,10); bc_int2num (&guess1,(*num)->n_len); bc_multiply (guess1, point5, &guess1, 0); guess1->n_scale = 0; bc_raise (guess, guess1, &guess, 0); bc_free_num (&guess1); cscale = 3; } /* Find the square root using Newton's algorithm. */ done = FALSE; while (!done) { bc_free_num (&guess1); guess1 = bc_copy_num (guess); bc_divide (*num, guess, &guess, cscale); bc_add (guess, guess1, &guess, 0); bc_multiply (guess, point5, &guess, cscale); bc_sub (guess, guess1, &diff, cscale+1); if (bc_is_near_zero (diff, cscale)) { if (cscale < rscale+1) cscale = MIN (cscale*3, rscale+1); else done = TRUE; } } /* Assign the number and clean up. */ bc_free_num (num); bc_divide (guess,_one_,num,rscale); bc_free_num (&guess); bc_free_num (&guess1); bc_free_num (&point5); bc_free_num (&diff); return 0; } /* The following routines provide output for bcd numbers package using the rules of POSIX bc for output. */ /* This structure is used for saving digits in the conversion process. */ typedef struct stk_rec { long digit; struct stk_rec *next; } stk_rec; /* The reference string for digits. */ static char ref_str[] = "0123456789ABCDEF"; /* A special output routine for "multi-character digits." Exactly SIZE characters must be output for the value VAL. If SPACE is non-zero, we must output one space before the number. OUT_CHAR is the actual routine for writing the characters. */ void bc_out_long (val, size, space, out_char) long val; int size, space; #ifdef __STDC__ void (*out_char)(int); #else void (*out_char)(); #endif { char digits[40]; int len, ix; if (space) (*out_char) (' '); sprintf (digits, "%ld", val); len = strlen (digits); while (size > len) { (*out_char) ('0'); size--; } for (ix=0; ix < len; ix++) (*out_char) (digits[ix]); } /* Output of a bcd number. NUM is written in base O_BASE using OUT_CHAR as the routine to do the actual output of the characters. */ void bc_out_num (num, o_base, out_char, leading_zero) bc_num num; int o_base; #ifdef __STDC__ void (*out_char)(int); #else void (*out_char)(); #endif int leading_zero; { char *nptr; int index, fdigit, pre_space; stk_rec *digits, *temp; bc_num int_part, frac_part, base, cur_dig, t_num, max_o_digit; /* The negative sign if needed. */ if (num->n_sign == MINUS) (*out_char) ('-'); /* Output the number. */ if (bc_is_zero (num)) (*out_char) ('0'); else if (o_base == 10) { /* The number is in base 10, do it the fast way. */ nptr = num->n_value; if (num->n_len > 1 || *nptr != 0) for (index=num->n_len; index>0; index--) (*out_char) (BCD_CHAR(*nptr++)); else nptr++; if (leading_zero && bc_is_zero (num)) (*out_char) ('0'); /* Now the fraction. */ if (num->n_scale > 0) { (*out_char) ('.'); for (index=0; indexn_scale; index++) (*out_char) (BCD_CHAR(*nptr++)); } } else { /* special case ... */ if (leading_zero && bc_is_zero (num)) (*out_char) ('0'); /* The number is some other base. */ digits = NULL; bc_init_num (&int_part); bc_divide (num, _one_, &int_part, 0); bc_init_num (&frac_part); bc_init_num (&cur_dig); bc_init_num (&base); bc_sub (num, int_part, &frac_part, 0); /* Make the INT_PART and FRAC_PART positive. */ int_part->n_sign = PLUS; frac_part->n_sign = PLUS; bc_int2num (&base, o_base); bc_init_num (&max_o_digit); bc_int2num (&max_o_digit, o_base-1); /* Get the digits of the integer part and push them on a stack. */ while (!bc_is_zero (int_part)) { bc_modulo (int_part, base, &cur_dig, 0); temp = (stk_rec *) malloc (sizeof(stk_rec)); if (temp == NULL) bc_out_of_memory(); temp->digit = bc_num2long (cur_dig); temp->next = digits; digits = temp; bc_divide (int_part, base, &int_part, 0); } /* Print the digits on the stack. */ if (digits != NULL) { /* Output the digits. */ while (digits != NULL) { temp = digits; digits = digits->next; if (o_base <= 16) (*out_char) (ref_str[ (int) temp->digit]); else bc_out_long (temp->digit, max_o_digit->n_len, 1, out_char); free (temp); } } /* Get and print the digits of the fraction part. */ if (num->n_scale > 0) { (*out_char) ('.'); pre_space = 0; t_num = bc_copy_num (_one_); while (t_num->n_len <= num->n_scale) { bc_multiply (frac_part, base, &frac_part, num->n_scale); fdigit = bc_num2long (frac_part); bc_int2num (&int_part, fdigit); bc_sub (frac_part, int_part, &frac_part, 0); if (o_base <= 16) (*out_char) (ref_str[fdigit]); else { bc_out_long (fdigit, max_o_digit->n_len, pre_space, out_char); pre_space = 1; } bc_multiply (t_num, base, &t_num, 0); } bc_free_num (&t_num); } /* Clean up. */ bc_free_num (&int_part); bc_free_num (&frac_part); bc_free_num (&base); bc_free_num (&cur_dig); bc_free_num (&max_o_digit); } } /* Convert a number NUM to a long. The function returns only the integer part of the number. For numbers that are too large to represent as a long, this function returns a zero. This can be detected by checking the NUM for zero after having a zero returned. */ long bc_num2long (num) bc_num num; { long val; char *nptr; int index; /* Extract the int value, ignore the fraction. */ val = 0; nptr = num->n_value; for (index=num->n_len; (index>0) && (val<=(LONG_MAX/BASE)); index--) val = val*BASE + *nptr++; /* Check for overflow. If overflow, return zero. */ if (index>0) val = 0; if (val < 0) val = 0; /* Return the value. */ if (num->n_sign == PLUS) return (val); else return (-val); } /* Convert an integer VAL to a bc number NUM. */ void bc_int2num (num, val) bc_num *num; int val; { char buffer[30]; char *bptr, *vptr; int ix = 1; char neg = 0; /* Sign. */ if (val < 0) { neg = 1; val = -val; } /* Get things going. */ bptr = buffer; *bptr++ = val % BASE; val = val / BASE; /* Extract remaining digits. */ while (val != 0) { *bptr++ = val % BASE; val = val / BASE; ix++; /* Count the digits. */ } /* Make the number. */ bc_free_num (num); *num = bc_new_num (ix, 0); if (neg) (*num)->n_sign = MINUS; /* Assign the digits. */ vptr = (*num)->n_value; while (ix-- > 0) *vptr++ = *--bptr; } /* Convert a numbers to a string. Base 10 only.*/ char * bc_num2str (num) bc_num num; { char *str, *sptr; char *nptr; int index, signch; /* Allocate the string memory. */ signch = ( num->n_sign == PLUS ? 0 : 1 ); /* Number of sign chars. */ if (num->n_scale > 0) str = (char *) malloc (num->n_len + num->n_scale + 2 + signch); else str = (char *) malloc (num->n_len + 1 + signch); if (str == NULL) bc_out_of_memory(); /* The negative sign if needed. */ sptr = str; if (signch) *sptr++ = '-'; /* Load the whole number. */ nptr = num->n_value; for (index=num->n_len; index>0; index--) *sptr++ = BCD_CHAR(*nptr++); /* Now the fraction. */ if (num->n_scale > 0) { *sptr++ = '.'; for (index=0; indexn_scale; index++) *sptr++ = BCD_CHAR(*nptr++); } /* Terminate the string and return it! */ *sptr = '\0'; return (str); } /* Convert strings to bc numbers. Base 10 only.*/ void bc_str2num (num, str, scale) bc_num *num; char *str; int scale; { int digits, strscale; char *ptr, *nptr; char zero_int; /* Prepare num. */ bc_free_num (num); /* Check for valid number and count digits. */ ptr = str; digits = 0; strscale = 0; zero_int = FALSE; if ( (*ptr == '+') || (*ptr == '-')) ptr++; /* Sign */ while (*ptr == '0') ptr++; /* Skip leading zeros. */ while (is_digit((int)*ptr)) ptr++, digits++; /* digits */ if (*ptr == '.') ptr++; /* decimal point */ while (is_digit((int)*ptr)) ptr++, strscale++; /* digits */ if ((*ptr != '\0') || (digits+strscale == 0)) { *num = bc_copy_num (_zero_); return; } /* Adjust numbers and allocate storage and initialize fields. */ strscale = MIN(strscale, scale); if (digits == 0) { zero_int = TRUE; digits = 1; } *num = bc_new_num (digits, strscale); /* Build the whole number. */ ptr = str; if (*ptr == '-') { (*num)->n_sign = MINUS; ptr++; } else { (*num)->n_sign = PLUS; if (*ptr == '+') ptr++; } while (*ptr == '0') ptr++; /* Skip leading zeros. */ nptr = (*num)->n_value; if (zero_int) { *nptr++ = 0; digits = 0; } for (;digits > 0; digits--) *nptr++ = CH_VAL(*ptr++); /* Build the fractional part. */ if (strscale > 0) { ptr++; /* skip the decimal point! */ for (;strscale > 0; strscale--) *nptr++ = CH_VAL(*ptr++); } } void out_char (int c) { putchar(c); } void out_char_stderr (int c) { fputc (c, stderr); } /* pn prints the number NUM in base 10. */ void pn (num) bc_num num; { bc_out_num (num, 10, out_char, 0); out_char ('\n'); } /* pn_stderr prints the number NUM in base 10 on stderr. */ void pn_stderr (num) bc_num num; { bc_out_num (num, 10, out_char_stderr, 0); out_char_stderr ('\n'); } /* pv prints a character array as if it was a string of bcd digits. */ void pv (name, num, len) char *name; unsigned char *num; int len; { int i; printf ("%s=", name); for (i=0; i This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include "numdiff.h" #include "xalloc.h" extern Real Zero; /* Care that internally the field numbers start from zero, not from one */ const long FIELDNO_MAX = (8 * FIELDMASK_SIZE); const char separator = ':'; static const struct numfmt defaults = {CURRENCY, DP, THSEP, GROUPING, POS_SIGN, NEG_SIGN, ECH, IU}; /* Create a new stack of threshold values, then push onto the stack the element { threshold = 0.0, beg1 = 0, end1 = FIELDNO_MAX-1, beg2 = 0, end2 = FIELDNO_MAX-1, double_range_spec = 0 } and return a pointer to the top of the stack. */ thrlist thrlist_new (void) { thrlist list; list = (thrlist) xmalloc (sizeof (thrlist_node)); initR (&list->threshold); /* copyR (&list->threshold, Zero); */ list->beg1 = list->beg2 = 0; list->end1 = list->end2 = FIELDNO_MAX - 1; list->double_range_spec = 0; list->next = NULL; return list; } /* If the string STR begins with a valid range of positive integer values, then set *B to (start value - 1), *E to (end value - 1), and, if TAIL != NULL, set *TAIL so that it points to the first character of STR after the range specification. Finally, return THRLIST_OK (0). For example, if STR == "1-10#abc", then *B will be set to 0, *E to 9, and *TAIL will point to the character '#'. If the string STR does not begin with a valid range of positive integer values, then leave *B, *E and *TAIL unchanged and return the error code THRLIST_INVALID_FORMAT. Remarks: 1. The following abbreviated range specifications are admitted, where N is a positive integer value and M == FIELDNO_MAX : N stays for N-N -N stays for 1-N N- stays for N-M . 2. The extremal values of a valid range are integer numbers between 1 and FIELDNO_MAX. In addition, the start value may not be greater than the end value. In case these conditions are not both true the function returns THRLIST_INVALID_FORMAT. */ static int set_interval (const char *str, unsigned long *b, unsigned long *e, char **tail) { long beg, end; char *ptr, *endptr; beg = end = -1; if (!str || !*str) return THRLIST_INVALID_FORMAT; /* illegal input */ /* If we arrive here we are sure that *str != '\0' ! */ if ((beg = strtol (str, &endptr, 10)) == 0 || beg > FIELDNO_MAX || beg < -FIELDNO_MAX) return THRLIST_INVALID_FORMAT; /* illegal input */ else if (beg < 0) { if (*endptr == '\0' || *endptr == separator) { end = -beg; beg = 1; } else return THRLIST_INVALID_FORMAT; } else if (*endptr == '\0' || *endptr == separator) end = beg; else if (*endptr == '-') { ptr = endptr + 1; if (*ptr == '\0' || *ptr == separator) end = FIELDNO_MAX; else { if ((end = strtol (ptr, &endptr, 10)) <= 0 || (*endptr != '\0' && *endptr != separator) || end > FIELDNO_MAX) return THRLIST_INVALID_FORMAT; /* illegal input */ } } if (beg > end) return THRLIST_INVALID_FORMAT; else { *b = (unsigned long)(beg-1); *e = (unsigned long)(end-1); if (tail != NULL) *tail = endptr; return THRLIST_OK; } } /* If the string DEF contains a specification of the form RANGE1:RANGE2, where the ranges RANGE1 and RANGE2 are both in the form accepted by the function set_interval() and have the same length, then set *BEG1, *END1, *BEG2 and *END2 to the extremal values of RANGE1 and RANGE2, respectively, after decrementing them of 1. Then set *DBL_RNG_SPEC to 1 and return THRLIST_OK to the calling function. If the string DEF contains a specification of the form RANGE, where RANGE is in the form accepted by the function set_interval(), then set *BEG1 and *BEG2 to (start_value_of_RANGE - 1), *END1 and *END2 (end_value_of_RANGE - 1), and *DBL_RNG_SPEC to zero. Then return THRLIST_OK to the calling function. If DEF does not contain a valid specification of the form RANGE or RANGE1:RANGE2 then return THRLIST_INVALID_FORMAT. If the given specification is valid, but RANGE1 and RANGE2 do not have the same length, then return THRLIST_INVALID_RANGES. Remark: In the last two cases after returning from the function the values of *BEG1, *BEG2, *END1, *END2 and *DBL_RNG_SPEC can not be trusted. */ static int set_intervals (const char *def, unsigned long *beg1, unsigned long *beg2, unsigned long *end1, unsigned long *end2, int *dbl_rng_spec) { char *endptr; int rv; rv = set_interval (def, beg1, end1, &endptr); if (rv != 0) return rv; else if (*endptr == separator) { rv = set_interval (endptr + 1, beg2, end2, &endptr); if ((rv != 0) || (*endptr != '\0')) return THRLIST_INVALID_FORMAT; else { *dbl_rng_spec = 1; return (*end2 + *beg1 == *end1 + *beg2) ? THRLIST_OK : THRLIST_INVALID_RANGES; } } else { /* *endptr == '\0' */ *beg2 = *beg1; *end2 = *end1; *dbl_rng_spec = 0; return THRLIST_OK; } } /* Push onto the stack pointed to by PLIST a new element according to the specification contained in the string DEF. This specification must have the form 1. THRESHOLD or 2. THRESHOLD:RANGE or 3. THRESHOLD:RANGE1:RANGE2 where THRESHOLD is a non-negative real (decimal) number, and RANGE or RANGE1:RANGE2 must be a valid specification for the function set_intervals(). In case 1. and 2. set the field DOUBLE_RANGE_SPEC of the just pushed element to zero, otherwise set it to 1. If DEF does not contain a valid specification, then do nothing but return a suitable error code (either THRLIST_INVALID_FORMAT or THRLIST_INVALID_RANGES). Otherwise, return THRLIST_OK. */ int thrlist_add (thrlist *plist, const char* def) { int rv, dbl_rng_spec; Real r; unsigned long beg1, beg2, end1, end2; thrlist_node *pnode; char *endptr; if (!def || !*def) return THRLIST_INVALID_FORMAT; /* no input */ /* If we arrive here we are sure that *def != '\0' ! */ initR (&r); str2R (def, &endptr, ISCALE, &defaults, &r); if (endptr == def || cmp(r, Zero) < 0) { delR (&r); return THRLIST_INVALID_FORMAT; /* no valid positive number */ } else { if (*endptr == '\0') { beg1 = beg2 = 0; end1 = end2 = FIELDNO_MAX - 1; dbl_rng_spec = 0; } else if (*endptr == separator) { if ( (rv = set_intervals (endptr + 1, &beg1, &beg2, &end1, &end2, &dbl_rng_spec)) != 0) { delR (&r); return rv; } } else { delR (&r); return THRLIST_INVALID_FORMAT; } pnode = (thrlist_node*) xmalloc (sizeof (thrlist_node)); initR (&pnode->threshold); copyR (&pnode->threshold, r); delR (&r); pnode->beg1 = beg1; pnode->beg2 = beg2; pnode->end1 = end1; pnode->end2 = end2; pnode->double_range_spec = dbl_rng_spec; pnode->next = *plist; *plist = pnode; return THRLIST_OK; } } /* Look in the stack LIST for the first element E from the top such that either E.DOUBLE_RANGE_SPEC == 0 and E.BEG1 <= FIELDNO1 <= E.END1, E.BEG2 <= FIELDNO2 <= E.END2, or E.DOUBLE_RANGE_SPEC == 1 and E.BEG1 <= FIELDNO1 <= E.END1, FIELDNO2 == E.BEG2 + FIELDNO1 - E.BEG1 . Then return the value of the comparison test between R and E.THRESHOLD. If there is no element E in LIST satisfying one of the previous conditions (this should never happen if LIST has been created by thrlist_new()), then interrupt the main program via exit(EXIT_TROUBLE) after printing a suitable error message on stdout. */ int thrlist_cmp (Real r, thrlist list, unsigned long fieldno1, unsigned long fieldno2) { thrlist_node *pnode, *pnext; pnode = list; while (pnode != NULL) { pnext = pnode->next; if ( (pnode->double_range_spec) ) { if (fieldno1 >= pnode->beg1 && fieldno1 <= pnode->end1 && fieldno2 == pnode->beg2 + fieldno1 - pnode->beg1) { return cmp (r, pnode->threshold); /* found */ } } else { if (fieldno1 >= pnode->beg1 && fieldno1 <= pnode->end1 && fieldno2 >= pnode->beg2 && fieldno2 <= pnode->end2) { return cmp (r, pnode->threshold); /* found */ } } pnode = pnext; } /* The code execution should NEVER reach this point. */ printf (_("Fatal error occurred during comparison of two numerical fields\n")); exit (EXIT_TROUBLE); } /* Dispose the stack pointed to by PLIST (free and clean the memory). */ void thrlist_dispose (thrlist *plist) { thrlist_node *pnode, *pnext; if (plist != NULL) { pnode = *plist; while (pnode != NULL) { pnext = pnode->next; delR (&pnode->threshold); free ((void*)pnode); pnode = pnext; } *plist = NULL; } } numdiff-5.9.0/cmpbuf.c0000644000175000017500000000741613054341114014125 0ustar paologpaolog/* Buffer primitives for comparison operations. Copyright (C) 1993, 1995, 1998, 2001, 2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #if HAVE_CONFIG_H # include #endif #include #include #include #ifndef SA_RESTART # ifdef SA_INTERRUPT /* e.g. SunOS 4.1.x */ # define SA_RESTART SA_INTERRUPT # else # define SA_RESTART 0 # endif #endif #if HAVE_UNISTD_H # include #endif #if HAVE_INTTYPES_H # include #endif #include #include "cmpbuf.h" /* Determine whether an integer type is signed, and its bounds. This code assumes two's (or one's!) complement with no holes. */ /* The extra casts work around common compiler bugs, e.g. Cray C 5.0.3.0 when t == time_t. */ #ifndef TYPE_SIGNED # define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) #endif #ifndef TYPE_MINIMUM # define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \ ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) \ : (t) 0)) #endif #ifndef TYPE_MAXIMUM # define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t))) #endif #ifndef PTRDIFF_MAX # define PTRDIFF_MAX TYPE_MAXIMUM (ptrdiff_t) #endif #ifndef SIZE_MAX # define SIZE_MAX TYPE_MAXIMUM (size_t) #endif #ifndef SSIZE_MAX # define SSIZE_MAX TYPE_MAXIMUM (ssize_t) #endif #undef MIN #define MIN(a, b) ((a) <= (b) ? (a) : (b)) /* Read NBYTES bytes from descriptor FD into BUF. NBYTES must not be SIZE_MAX. Return the number of characters successfully read. On error, return SIZE_MAX, setting errno. The number returned is always NBYTES unless end-of-file or error. */ size_t block_read (int fd, char *buf, size_t nbytes) { char *bp = buf; char const *buflim = buf + nbytes; size_t readlim = SSIZE_MAX; do { size_t bytes_to_read = MIN (buflim - bp, readlim); ssize_t nread = read (fd, bp, bytes_to_read); if (nread <= 0) { if (nread == 0) break; /* Accommodate Tru64 5.1, which can't read more than INT_MAX bytes at a time. They call that a 64-bit OS? */ if (errno == EINVAL && INT_MAX < bytes_to_read) { readlim = INT_MAX; continue; } /* This is needed for programs that have signal handlers on older hosts without SA_RESTART. It also accommodates ancient AIX hosts that set errno to EINTR after uncaught SIGCONT. See (1993-04-22). */ if (! SA_RESTART && errno == EINTR) continue; return SIZE_MAX; } bp += nread; } while (bp < buflim); return bp - buf; } /* Least common multiple of two buffer sizes A and B. However, if either A or B is zero, or if the multiple is greater than LCM_MAX, return a reasonable buffer size. */ size_t buffer_lcm (size_t a, size_t b, size_t lcm_max) { size_t lcm, m, n, q, r; /* Yield reasonable values if buffer sizes are zero. */ if (!a) return b ? b : 8 * 1024; if (!b) return a; /* n = gcd (a, b) */ for (m = a, n = b; (r = m % n) != 0; m = n, n = r) continue; /* Yield a if there is an overflow. */ q = a / n; lcm = q * b; return lcm <= lcm_max && lcm / b == q ? lcm : a; } numdiff-5.9.0/numutil.c0000444000175000017500000005271613054341114014347 0ustar paologpaolog/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "numdiff.h" #include #include /* for exit() */ #include #if defined(HAVE_LOCALECONV) && defined(USE_GMP) #include #endif /* HAVE_LOCALECONV and USE_GMP */ /* The following structure is used to store the canonical form of a real number. The canonical form corresponding to zero is .sgn = 0 .ipart = NULL .dpart = NULL .expn = 0 . If X is a non-null number with sign S (either + or -), integer part II...II (each I is a digit but the digits have not to be necessarily all equal), decimal part DD...DD (each D is a digit but the digits have not to be necessarily all equal) and exponent N, i.e. X = SII...II(decimal point)DD...DD * 10^N, then the canonical form of X is given by: .sgn = S .ipart = "II...II" .dpart = "DD...DD" and, denoted by NI the number of digits of the integer part and by NN the number of null digits after the decimal point (NN can be zero, for instance if the first digit of the decimal part is not null), +---- N + NI - 1, if NI > 0 | .expn = < | +---- N - NN - 1, if NI == 0 The exponent stored in the canonical form is then equal to the one that you would find in the scientific representation of the number. If the integer (decimal) part of X is zero, then .ipart (.dpart respectively) is the empty string. The string that one obtains by appending the decimal part to the integer part is what I call mantissa. Given two non-null numbers X and Y both in canonical form, they are equal if and only if they have the same sign, the same exponents and the same mantissa. */ struct canform { unsigned char sgn; char *ipart, *dpart; long expn; }; struct canform null = { 0, NULL, NULL, 0}; static char* anum (const char *str, const struct numfmt* pnf) { char *ptr; long digits, strscale; size_t length; ptr = (char*)str; digits = 0; strscale = 0; length = strlen(pnf->currency); if ( (*ptr == pnf->pos_sign) || (*ptr == pnf->neg_sign) ) move_ahead(ptr); if ( length > 0 && strncmp (ptr, pnf->currency, length) == 0 ) ptr += length; /* Skip the currency name, if specified */ if (pnf->grouping > 0) { while ( (is_digit((int)*ptr)) || *ptr == pnf->thsep ) { int first_sep = 1; if (*ptr == pnf->thsep) { unsigned long i; char* ptr2; if ((first_sep)) { for (ptr2 = ptr; ptr2 > str && (is_digit ((int)*(ptr2-1))); ptr2--); if ((i=ptr-ptr2) == 0 || i > pnf->grouping) { return (char*) str; } first_sep = 0; } for (ptr2 = ptr + 1; (is_digit((int)*ptr2)); ptr2++); if ((i=ptr2-ptr-1) != pnf->grouping) { return (char*) str; } ptr++; } else { move_ahead(ptr), digits++; } } } else { while ( (is_digit((int)*ptr)) ) { move_ahead(ptr), digits++; } } if (*ptr == pnf->dp) move_ahead(ptr); while ( (is_digit((int)*ptr)) ) move_ahead(ptr), strscale++; if (digits+strscale == 0) return (char*)str; if (TOLOWER(*ptr) == TOLOWER(pnf->ech) && !is_space (*(ptr+1))) { char *tail; long expn; expn = strtol (ptr + 1, &tail, 10); if (expn < MIN_EXPN && tail != ptr + 1) { fprintf (stderr, _("%s: a number with a too small exponent has been found,\nnamely \"%s\".\n"), PACKAGE, str); fprintf (stderr, _("Exponents smaller than %ld are not accepted,\n"), MIN_EXPN); fprintf (stderr, _("the execution of the program ends now\n")); exit (EXIT_TROUBLE); } if (expn > MAX_EXPN && tail != ptr + 1) { fprintf (stderr, _("%s: a number with a too large exponent has been found,\nnamely \"%s\".\n"), PACKAGE, str); fprintf (stderr, _("Exponents larger than %ld are not accepted,\n"), MAX_EXPN); fprintf (stderr, _("the execution of the program ends now\n")); exit (EXIT_TROUBLE); } return (tail != ptr + 1 ? tail : ptr); } else return ptr; } /* This function is going to be used in inout.c and util.c */ char* acxnum (const char *str, const struct numfmt* pnf) { char *ptr, *endrp, *ptr2; endrp = ptr = anum (str, pnf); if (ptr != str) { if (*ptr == pnf->iu) { return ptr + 1; } else { while (is_space (*ptr)) ptr++; if (*ptr == POS_SIGN || *ptr == NEG_SIGN) { ptr2 = anum (ptr, pnf); return (*ptr2 != pnf->iu ? endrp : ptr2 + 1); } else return endrp; } } else return ptr; } static char* snum (const char *str, const struct numfmt* pnf, struct canform* pcform) { char *ptr = (char*)str; char *it = pcform->ipart; int nonnull_digit_found = 0; long digits, strscale, nzeros, expn; char* tail; size_t length; digits = strscale = 0; length = strlen(pnf->currency); if ( (*ptr == pnf->pos_sign) ) { pcform->sgn = POS_SIGN; move_ahead(ptr); } else if ( (*ptr == pnf->neg_sign) ) { pcform->sgn = NEG_SIGN; move_ahead(ptr); } if ( length > 0 && strncmp (ptr, pnf->currency, length) == 0 ) ptr += length; /* Skip the currency name, if specified */ if (pnf->grouping > 0) { while ( (is_digit((int)*ptr)) || *ptr == pnf->thsep ) { int first_sep = 1; if (*ptr == pnf->thsep) { unsigned long i; char* ptr2; if ((first_sep)) { for (ptr2 = ptr; ptr2 > str && (is_digit ((int)*(ptr2-1))); ptr2--); if ((i=ptr-ptr2) == 0 || i > pnf->grouping) { return (char*) str; } first_sep = 0; } for (ptr2 = ptr + 1; (is_digit((int)*ptr2)); ptr2++); if ((i=ptr2-ptr-1) != pnf->grouping) { return (char*) str; } ptr++; } else { if ((nonnull_digit_found |= *ptr > CHAR_ZERO)) *it++ = *ptr; move_ahead(ptr), digits++; } } } else { while ( (is_digit((int)*ptr)) ) { if ((nonnull_digit_found |= *ptr > CHAR_ZERO)) *it++ = *ptr; move_ahead(ptr), digits++; } } if (*ptr == pnf->dp) { it = pcform->dpart; move_ahead(ptr); } while ( (is_digit((int)*ptr)) ) { for (nzeros = 0; *ptr == CHAR_ZERO; nzeros++, move_ahead(ptr)); strscale += nzeros; if ( (is_digit((int)*ptr)) ) { nonnull_digit_found = 1; for (; nzeros > 0; nzeros--) *it++ = CHAR_ZERO; *it++ = *ptr; move_ahead(ptr), strscale++; } } if (digits+strscale == 0) return (char*)str; if (!nonnull_digit_found) { free((void*)pcform->ipart); free((void*)pcform->dpart); pcform->ipart = pcform->dpart = NULL; pcform->sgn = 0; } if (TOLOWER(*ptr) == TOLOWER(pnf->ech) && !is_space (*(ptr+1))) { expn = strtol (ptr + 1, &tail, 10); if (tail != ptr + 1) { if (expn < MIN_EXPN) { fprintf (stderr, _("%s: a number with a too small exponent has been found,\nnamely \"%s\".\n"), PACKAGE, str); fprintf (stderr, _("Exponents smaller than %ld are not accepted,\n"), MIN_EXPN); fprintf (stderr, _("the execution of the program ends now\n")); exit (EXIT_TROUBLE); } if (expn > MAX_EXPN) { fprintf (stderr, _("%s: a number with a too large exponent has been found,\nnamely \"%s\".\n"), PACKAGE, str); fprintf (stderr, _("Exponents larger than %ld are not accepted,\n"), MAX_EXPN); fprintf (stderr, _("the execution of the program ends now\n")); exit (EXIT_TROUBLE); } pcform->expn = (nonnull_digit_found) ? expn : 0; return tail; } else { pcform->expn = 0; return ptr; } } else return ptr; } static int inc_with_check (long* pl, unsigned long r) { long l = *pl; unsigned long L; if (r == 0) return 0; else if (r > LONG_MAX) return -1; /* After this we are sure that 1 <= r <= LONG_MAX */ else if ( (long)r >= -l ) /* This is surely the case if l >= 0 */ { L = l + r; if (L > LONG_MAX) return -1; else { *pl = L; return 0; } } else { /* r < -l ==> l < r+l < 0 */ *pl = l + (long)r; return 0; } } static int dec_with_check (long* pl, unsigned long r) { long l = *pl; unsigned long L; if (r == 0) return 0; else if (r > LONG_MAX) return -1; /* After this we are sure that 1 <= r <= LONG_MAX */ else if ( (long)r >= l ) /* This is surely the case if l <= 0 */ { L = r - l; if (L > LONG_MAX) return -1; else { /* 0 <= r - l <= LONG_MAX ==> LONG_MIN <= -LONG_MAX <= l - r <= 0 */ *pl = -(long)L; return 0; } } else { /* r < l ==> 0 < l-r < l */ *pl = l - (long)r; return 0; } } static void msg_and_abort (const char* progname) { fprintf (stderr, "%s: number with too big mantissa or\nwith exponent out of the allowed range\n", progname); exit (EXIT_TROUBLE); } static void normalize (struct canform* pnum) { size_t lip, lnullprefix; char *ptr; if (!pnum || !pnum->ipart || !pnum->dpart) return; if (pnum->sgn == 0) pnum->sgn = POS_SIGN; if ( (lip = strlen (pnum->ipart)) > ULONG_MAX ) msg_and_abort (PACKAGE); if (lip != 0) { if ( inc_with_check (&pnum->expn, lip-1) != 0 ) msg_and_abort (PACKAGE); if ( *pnum->dpart == '\0' ) for (ptr = pnum->ipart + lip - 1; *ptr == CHAR_ZERO; *ptr-- = '\0'); } else { /* The integer part has zero length ==> decimal part with positive length */ for (lnullprefix = 0, ptr = pnum->dpart; *ptr == CHAR_ZERO; lnullprefix++, ptr++); if ( lnullprefix > ULONG_MAX ) msg_and_abort (PACKAGE); if ( dec_with_check (&pnum->expn, lnullprefix+1) != 0 ) msg_and_abort (PACKAGE); if ((lnullprefix)) { for (ptr = pnum->dpart + lnullprefix; *ptr != '\0'; ptr++) *(ptr-lnullprefix) = *ptr; *(ptr-lnullprefix) = '\0'; } } } static char* scxnum (const char *str, const struct numfmt* pnf, struct canform* pre, struct canform* pim) { char *ptr, *endrp, *ptr2; struct canform cform1, cform2; size_t slen = strlen (str); cform1.sgn = 0; cform1.ipart = stralloc (slen); cform1.dpart = stralloc (slen); cform1.expn = 0; endrp = ptr = snum (str, pnf, &cform1); #ifdef _SCXNUM_DEBUG_ fprintf (stderr, "%s -->\n sign = \'%c\'\n ip = \"%s\"\n dp = \"%s\"\n expn = %ld, tail = \"%s\n", str, cform1.sgn, cform1.ipart, cform1.dpart, cform1.expn, endrp); #endif if (ptr != str) { normalize (&cform1); #ifdef _SCXNUM_DEBUG_ fprintf (stderr, "After normalization:\n"); fprintf (stderr, "%s -->\n sign = \'%c\'\n ip = \"%s\"\n dp = \"%s\"\n expn = %ld, tail = \"%s\n", str, cform1.sgn, cform1.ipart, cform1.dpart, cform1.expn, endrp); #endif if (*ptr == pnf->iu) { /* We have read a pure imaginary number. */ *pre = null; *pim = cform1; return ptr + 1; } else { /* We have to check if we have read a pure real number or if we can read a full complex number. */ *pre = cform1; while (is_space (*ptr)) ptr++; if (*ptr == POS_SIGN || *ptr == NEG_SIGN) { cform2.sgn = 0; cform2.ipart = stralloc (slen); cform2.dpart = stralloc (slen); cform2.expn = 0; ptr2 = snum (ptr, pnf, &cform2); #ifdef _SCXNUM_DEBUG_ fprintf (stderr, "%s -->\n sign = \'%c\'\n ip = \"%s\"\n dp = \"%s\"\n expn = %ld, tail = \"%s\n", ptr, cform2.sgn, cform2.ipart, cform2.dpart, cform2.expn, ptr2); #endif if (*ptr2 == pnf->iu) { /* We have read a full complex number. */ normalize (&cform2); #ifdef _SCXNUM_DEBUG_ fprintf (stderr, "After normalization:\n"); fprintf (stderr, "%s -->\n sign = \'%c\'\n ip = \"%s\"\n dp = \"%s\"\n expn = %ld, tail = \"%s\n", ptr, cform2.sgn, cform2.ipart, cform2.dpart, cform2.expn, ptr2); #endif *pim = cform2; return ptr2 + 1; } else { /* We have read a pure real number. */ free ((void*) cform2.ipart); free ((void*) cform2.dpart); *pim = null; return endrp; } } else { /* We have read a pure real number. */ *pim = null; return endrp; } } } else { /* We have read no valid number, clean and return. */ free ((void*) cform1.ipart); free ((void*) cform1.dpart); *pre = *pim = null; return ptr; } } /* The following function compares two canonic forms of numerical values. It returns 0 if they are equal, 1 if they differ. */ static int compare_canonic_forms (struct canform x, struct canform y) { char *px, *py; int ppx, ppy; if (!x.ipart && !x.dpart) { /* If `x' is zero, then */ return ((y.ipart) || (y.dpart) ? 1 : 0); /* return 1 if `y' is not zero, */ /* 0 if also `y' is zero */ } else { /* If `x' is not zero, then */ if (!y.ipart && !y.dpart) return 1; /* return 1 if `y' is zero */ /* If both `x' and `y' are not zero */ /* we need a detailed comparison */ if (x.sgn != y.sgn) return 1; if (x.expn != y.expn) return 1; /* After comparing signs and exponents */ /* we compare the mantissas */ ppx = ppy = 0; px = x.ipart; py = y.ipart; /* Explanation about the meaning of `ppx' and `ppy': `ppx' (`ppy') is 0 as long as `px' (`py') points to a character in the string `x.ipart' (`y.ipart'), `ppx' (`ppy') is 1 when `px' (`py') points to a character in the string `x.dpart' (`y.dpart'), and becomes 2 after that both `x.ipart' and `x.dpart' (`y.ipart' and `y.dpart') have been scanned */ do { for ( ; *px != '\0' && *py != '\0' && *px == *py; px++, py++); if (*px == '\0') { ppx++; if (ppx == 1) px = x.dpart; } if (*py == '\0') { ppy++; if (ppy == 1) py = y.dpart; } } while (*px == *py && ppx < 2 && ppy < 2); return (*px != *py); } } /* The following function compares `str1' and `str2' assuming that they both contain a valid (possibly complex) number and neglecting differences in the numeric format. To be sure that the contents of `str1' and `str2' correspond to valid numbers, call before acxnum() on `str1' and `str2'. This function returns !0 to mean that the numeric contents of `str1' and `str2' differ, else 0. This function is going to be used in util.c */ int compare_numeric_strings (const char *str1, const struct numfmt* pnf1, const char *str2, const struct numfmt* pnf2) { struct canform re1, im1, re2, im2; int re_differ, im_differ; scxnum (str1, pnf1, &re1, &im1); scxnum (str2, pnf2, &re2, &im2); re_differ = compare_canonic_forms (re1, re2); im_differ = compare_canonic_forms (im1, im2); /* Clean the memory before returning the result of the comparison */ if ((re1.ipart)) free ((void*)re1.ipart); if ((re1.dpart)) free ((void*)re1.dpart); if ((im1.ipart)) free ((void*)im1.ipart); if ((im1.dpart)) free ((void*)im1.dpart); if ((re2.ipart)) free ((void*)re2.ipart); if ((re2.dpart)) free ((void*)re2.dpart); if ((im2.ipart)) free ((void*)im2.ipart); if ((im2.dpart)) free ((void*)im2.dpart); return (re_differ || im_differ); } #define HNDDULONG 80 static void hash_canonic_form (struct canform num, int pos_flag, hash_value* ph) { char *ptr, exp_ch[HNDDULONG+1]; size_t li, ld, le; int s_exp = (num.expn >= 0) ? 1 : -1; unsigned long abs_exp = num.expn * s_exp; li = (num.ipart) ? strlen(num.ipart) : 0; ld = (num.dpart) ? strlen(num.dpart) : 0; exp_ch[HNDDULONG] = '\0'; for (le = 0; abs_exp != 0; le++, abs_exp /= 10) exp_ch[HNDDULONG-1-le] = (char)(abs_exp % 10) + CHAR_ZERO; if (le > 0) exp_ch[HNDDULONG-1-le] = (s_exp < 0) ? NEG_SIGN : POS_SIGN; else exp_ch[HNDDULONG-1] = CHAR_ZERO; s_exp = HNDDULONG-2-le; exp_ch[s_exp] = ECH; if (li == 0 && ld == 0) { *ph = HASH (*ph, (unsigned char) CHAR_ZERO); *ph = HASH (*ph, (unsigned char) ECH); *ph = HASH (*ph, (unsigned char) CHAR_ZERO); } else { if (num.sgn == NEG_SIGN) *ph = HASH (*ph, (unsigned char) NEG_SIGN); else { if ((pos_flag)) *ph = HASH (*ph, (unsigned char) POS_SIGN); } if (li > 0) { *ph = HASH (*ph, (unsigned char) *num.ipart); if (li > 1 || ld > 0) *ph = HASH (*ph, (unsigned char) DP); for (ptr = num.ipart+1; *ptr != '\0'; ptr++) *ph = HASH (*ph, (unsigned char) *ptr); if (ld > 0) { for (ptr = num.dpart; *ptr != '\0'; ptr++) *ph = HASH (*ph, (unsigned char) *ptr); } } else /* li == 0 but ld > 0 */ { *ph = HASH (*ph, (unsigned char) *num.dpart); if (ld > 1) { *ph = HASH (*ph, (unsigned char) DP); for (ptr = num.dpart+1; *ptr != '\0'; ptr++) *ph = HASH (*ph, (unsigned char) *ptr); } } for (ptr = exp_ch + s_exp; *ptr != '\0'; ptr++) *ph = HASH (*ph, (unsigned char) *ptr); } } /* This function is going to be used in inout.c */ char* hcxnum (const char *str, const struct numfmt* pnf, hash_value *ph) { struct canform re, im; char *endptr; endptr = scxnum (str, pnf, &re, &im); if (endptr != str) { if ((im.ipart == NULL && im.dpart == NULL)) /* If the imaginary part is zero, hash only the real part */ hash_canonic_form (re, 0, ph); else { /* If the imaginary part is not zero but the real part is null, then hash only the imaginary part */ if ((re.ipart == NULL && re.dpart == NULL)) hash_canonic_form (im, 0, ph); else { /* If both real and imaginary part are not zero, hash both of them. The imaginary part must always be hashed with its sign */ hash_canonic_form (re, 0, ph); hash_canonic_form (im, 1, ph); } *ph = HASH (*ph, IU); } } /* Clean the memory and return */ if ((re.ipart)) free ((void*)re.ipart); if ((re.dpart)) free ((void*)re.dpart); if ((im.ipart)) free ((void*)im.ipart); if ((im.dpart)) free ((void*)im.dpart); return endptr; } #ifdef USE_GMP int mpf_a2num (Real* pr, const char *q, char** endptr, const struct numfmt* pnf) { struct canform cform; size_t slen = strlen (q); cform.sgn = 0; cform.ipart = stralloc (slen); cform.dpart = stralloc (slen); cform.expn = 0; *endptr = snum (q, pnf, &cform); if (*endptr != q) { char *ptr, *str; long e; size_t len, explen; #ifdef HAVE_LOCALECONV struct lconv *plconv = localeconv(); char* dec_point = plconv->decimal_point; #else /* not HAVE_LOCALECONV */ char* dec_point = "."; #endif /* not HAVE_LOCALECONV */ if (cform.ipart == NULL || cform.dpart == NULL) { /* The number contained in the string Q is zero */ mpf_set_ui (*pr, 0); return 0; } normalize (&cform); e = cform.expn >= 0 ? cform.expn : -cform.expn; for (len = 0; e != 0; len++, e /= 10); explen = len; if (cform.expn < 0) /* We need space for the minus sign in front of the exponent */ len++; if (cform.sgn == NEG_SIGN) /* We need space for the minus sign in front of the whole number */ len++; /* We need space also for the decimal point and the exponent letter */ len += strlen (cform.ipart) + strlen (cform.dpart) + strlen(dec_point) + 1; ptr = str = stralloc (len); if (cform.sgn == NEG_SIGN) { *ptr = NEG_SIGN; ptr++; } if (*cform.ipart != '\0') { *ptr = *cform.ipart; strcat (str, dec_point); strcat (str, cform.ipart+1); strcat (str, cform.dpart); } else { *ptr = *cform.dpart; strcat (str, dec_point); strcat (str, cform.dpart+1); } if (explen > 0) { for (ptr++; *ptr != '\0'; ptr++); *ptr = ECH; if (cform.expn < 0) { ptr++; *ptr = NEG_SIGN; } ptr += explen; for (e = cform.expn >= 0 ? cform.expn : -cform.expn; e != 0; ptr--, e /= 10) *ptr = CHAR_ZERO + e % 10; } if ( mpf_set_str (*pr, str, 10) == -1 ) { /* This should never happen. If mpf_set_str() returns -1, then */ /* there is something wrong with the code above. */ fprintf (stderr, _("The string \"%s\"\nis not a valid number, the execution of the program ends now\n"), str); free ((void*) cform.ipart); free ((void*) cform.dpart); free ((void*) str); exit (EXIT_TROUBLE); } else { free ((void*) cform.ipart); free ((void*) cform.dpart); free ((void*) str); return 0; } } /* *endptr != q */ else { /* We have read no valid number, then free the previously allocated memory, set the value pointed to by PR to zero and return -1 */ free ((void*) cform.ipart); free ((void*) cform.dpart); mpf_set_ui (*pr, 0); return -1; } /* *endptr == q */ } #endif /* USE_GMP */ numdiff-5.9.0/read_line.c0000444000175000017500000000766413054341114014576 0ustar paologpaolog/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifdef _TEST_READ_LINE_ #include #include #include #define BUFF_SIZE 32 /* Error codes */ #define OK 0 #define LINE_INTERR 1 #define EOF_REACHED 2 #define READING_ERROR 3 #define OUT_OF_MEMORY 4 /* *** */ #define OPEN_FAILED 5 #define WRONG_USAGE 6 #define FILE_IS_BINARY 7 #endif /* _TEST_READ_LINE_ */ char* read_line (FILE* pf, int* errcode) { char buffer[BUFF_SIZE]; char *ptr, *line = NULL; size_t lline = 0; register size_t n; register int ch; int exception_occurred = 0; do { for (n = 0; n < BUFF_SIZE-1 && (ch = getc(pf)) != EOF && ch != '\0' && ch != '\n'; n++) buffer[n] = ch; if ( !(exception_occurred = ((ch == EOF && n == 0) || ch == '\0')) ) { /* If we enter this block, then CH is not the nul character. Thus either is n == BUFF_SIZE-1, or is CH == EOF or is CH == NEWLINE. */ if (n == BUFF_SIZE-1 || ch == EOF) { buffer[n] = '\0'; lline += n; } else { buffer[n] = '\n'; buffer[n+1] = '\0'; lline += (n+1); } if (!line) ptr = (char*) calloc (lline + 1, sizeof(char)); else ptr = (char*) realloc ((void*)line, (lline + 1) * sizeof(char)); if (!ptr) { if ((line)) free ((void*)line); *errcode = OUT_OF_MEMORY; return NULL; } else { line = ptr; strcat (line, buffer); } if (lline > 0 && line[lline-1] == '\n') break; } } while (!exception_occurred); if ((exception_occurred)) { if ( (ferror(pf)) ) *errcode = READING_ERROR; else if ( ch == '\0' ) *errcode = FILE_IS_BINARY; else if (lline > 0) *errcode = LINE_INTERR; else *errcode = EOF_REACHED; } else *errcode = OK; return line; } #ifdef _TEST_READ_LINE_ int main (int argc, char* argv[]) { FILE* fp; if (argc != 2) { fprintf (stderr, "\n*** Usage: %s FILEPATH\n", argv[0]); return 1; } else if ( !(fp = fopen (argv[1], "r")) ) { fprintf (stderr, "\n*** Cannot open \"%s\" for reading:\n", argv[1]); perror(NULL); return 1; } else { char* line = NULL; int errcode = OK; do { line = read_line (fp, &errcode); switch (errcode) { case FILE_IS_BINARY: fputs ("\n*** Cannot read from a binary file\n", stderr); break; case LINE_INTERR: fputs (line, stdout); puts (""); break; case READING_ERROR: fputs ("\n*** Error while reading from file\n", stderr); break; case OUT_OF_MEMORY: fputs ("\n*** Memory exhausted while reading from file, abort now...\n", stderr); break; case EOF_REACHED: puts (""); break; default: /* OK */ fputs (line, stdout); break; } if ((line)) free ((void*)line); } while (errcode == OK); if ( (fclose(fp)) ) { fprintf (stderr, "\n*** Could not close \"%s\":\n", argv[1]); perror(NULL); return 1; } else { return 0; } } } #endif /* _TEST_READ_LINE_ */ numdiff-5.9.0/setmode.h0000644000175000017500000000176713054341114014321 0ustar paologpaolog/* Set a file descriptor's mode to binary or to text. Copyright (C) 2001 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Written by Paul Eggert */ #ifndef set_binary_mode bool set_binary_mode (int, bool); # if ! HAVE_SETMODE_DOS # define set_binary_mode(fd, mode) 1 # endif #endif numdiff-5.9.0/io.c0000444000175000017500000000732613054341114013256 0ustar paologpaolog/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include"numdiff.h" #ifdef _DMALLOC_ #include /* Useful only for the debugging */ #endif #include"read_line.c" static void print_head (const char* str, size_t length) { const char* t; for (t = str; t - str < length; putchar(*t), t++); } static void print_ws (unsigned n) { while ((n--)) putchar (' '); } static void writeln (const char* line, int addemptyline) { const char *ptr; for (ptr = line; *ptr != '\0'; putchar(*ptr), ptr++); if (ptr == line || *(ptr-1) != '\n') puts (EOF_INDICATOR); if ((addemptyline)) putchar('\n'); } /* This function assumes that at least one between line1 and line2 is not empty (!NULL). */ void print_lines (const char* line1, const char* line2, unsigned long lineno1, unsigned long lineno2, int delimiter_only) { puts (LINE_SEP); if (!delimiter_only) { if (!line1) { printf (" <==\n##%-7lu ==> ", lineno2); writeln (line2, 1); } else if (!line2) { printf ("##%-7lu <== ", lineno1); writeln (line1, 0); printf (" ==>\n\n"); } else { printf ("##%-7lu <== ", lineno1); writeln (line1, 0); printf ("##%-7lu ==> ", lineno2); writeln (line2, 1); } } } /* This function assumes that at least one between field1 and field2 is not empty. */ void print_fields (const char* field1, const char* field2, size_t l1, size_t l2, unsigned long lineno1, unsigned long lineno2, unsigned long fieldno1, unsigned long fieldno2) { fieldno1++; /* The field number must start from 1, not from 0 */ fieldno2++; /* The field number must start from 1, not from 0 */ if (*field1 == '\0') { printf ("##%-7lu <==\n##%-7lu #>%-3lu ==> ", lineno1, lineno2, fieldno2); /* length(" #> ") + 3 = 7 white spaces before the arrow */ writeln (field2, 0); } else if (*field2 == '\0') { printf ("##%-7lu #>%-3lu <== ", lineno1, fieldno1); writeln (field1, 0); /* length(" #> ") + 3 = 7 white spaces before the arrow */ printf ("##%-7lu ==>\n", lineno2); } else { printf ("##%-7lu #:%-3lu <== ", lineno1, fieldno1); print_head (field1, l1); putchar ('\n'); printf ("##%-7lu #:%-3lu ==> ", lineno2, fieldno2); print_head (field2, l2); putchar ('\n'); } } void print_errors (Real abserr, Real relerr, int human_readable_format) { if ((human_readable_format)) { fputs (_("@ Absolute error = "), stdout); printno (abserr, DEF_LIM); fputs (_(", Relative error = "), stdout); printno (relerr, DEF_LIM); putchar ('\n'); } else { printno (abserr, DEF_LIM); fputc (':', stdout); printno (relerr, DEF_LIM); fputc (':', stdout); } } void print_separator (void) { putchar ('@'); print_ws (53); puts ("@@"); } numdiff-5.9.0/flags.c0000444000175000017500000001356413054341114013744 0ustar paologpaolog/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include"numdiff.h" #include /* Constants and default values */ #define CHUNK_ALLOC 20480 static flg_array internal_table; /* `table' must be the address of a `flg_array' structure. */ static int init_flg_array (flg_array* table) { if ((table)) { table->ptr = NULL; table->size = table->len = 0; return 0; } else return -1; } int init_flags (void) { return init_flg_array (&internal_table); } /* `table' must be the address of a `flg_array' structure. */ static int print_flg_array (FILE* fp, const flg_array* table) { size_t n; unsigned short i; unsigned char byte, elem; if (!table || !table->ptr) return (fputs (_("\n"), fp) == EOF); else { int outerror = 0; for (n = 0; !outerror && n < table->len; n += 4U) { byte = table->ptr[n/4U]; for (i = 0; i < 4U; i++) { if ( (elem = (byte & 0x03 << 2*i) >> 2 * i) ) { if ( fprintf (fp, "%u", elem) < 0 ) { outerror = 1; break; } } else break; } } if (!outerror) outerror = (fputc ('\n', fp) == EOF); return outerror; } } int print_flags (FILE* fp) { return print_flg_array (fp, &internal_table); } /* array must be the address of a `flg_array' structure. */ static void addnewelem (flg_array* array, unsigned char elem) { if (!array) return; if ( !array->ptr ) { array->ptr = xcalloc (CHUNK_ALLOC, sizeof (unsigned char)); array->size = CHUNK_ALLOC; array->ptr[0] = elem; array->len = 1; #ifdef __MEMDEBUG__ fprintf (stderr, "size = %6zu, len = %6zu, string:", array->size, array->len); print_flg_array (stderr, array); #endif } else { if (array->len == 4 * array->size - 1) { unsigned char* p; array->ptr = xrealloc (array->ptr, array->size + CHUNK_ALLOC); array->size += CHUNK_ALLOC; array->ptr[array->len / 4U] |= elem << 2 * (array->len % 4U); array->len++; /* Now array->len == 4 * array->"old"size */ for (p = array->ptr + array->len / 4; p < array->ptr + array->size; *p = 0, p++); #ifdef __MEMDEBUG__ fprintf (stderr, "size = %6zu, len = %6zu, string:", array->size, array->len); print_flg_array (stderr, array); #endif } else { array->ptr[array->len / 4U] |= elem << 2 * (array->len % 4U); array->len++; #ifdef __MEMDEBUG__ fprintf (stderr, "size = %6zu, len = %6zu, string:", array->size, array->len); print_flg_array (stderr, array); #endif } } } flg_array copy_of_intflagtab (void) { return internal_table; } /* array must be the address of a `flg_array' structure. */ static void destroy_flg_array (flg_array* array) { if ((array) && (array->ptr)) { free ((void*)array->ptr); array->ptr = NULL; array->size = array->len = 0; } } void erase_flags (void) { destroy_flg_array (&internal_table); } static void notedown_sdiff_common_lines (lin, lin); static void notedown_sdiff_hunk (struct change *); /* Next line number to be printed in the two input files. */ static lin next0, next1; /* * Note down the edit-script SCRIPT in the INTERNAL_TABLE. */ void notedown_sdiff_script (struct change *script) { next0 = next1 = - files[0].prefix_lines; print_script (script, notedown_sdiff_hunk); notedown_sdiff_common_lines (files[0].valid_lines, files[1].valid_lines); #ifdef _DEBUG_FLAGSTABLE_ print_flg_array (stderr, &internal_table); #endif } /* Print lines common to both files in side-by-side format. */ static void notedown_sdiff_common_lines (lin limit0, lin limit1) { lin i0 = next0, i1 = next1; if (i0 != limit0 || i1 != limit1) { for (; i0 != limit0 && i1 != limit1; i0++, i1++) addnewelem (&internal_table, 3); for (; i1 != limit1; i1++) addnewelem (&internal_table, 2); for (; i0 != limit0; i0++) addnewelem (&internal_table, 1); } next0 = limit0; next1 = limit1; } /* Note down a hunk of an sdiff diff. This is a contiguous portion of a complete edit script, describing changes in consecutive lines. */ static void notedown_sdiff_hunk (struct change *hunk) { lin first0, last0, first1, last1; register lin i, j; /* Determine range of line numbers involved in each file. */ enum changes changes = analyze_hunk (hunk, &first0, &last0, &first1, &last1); if (!changes) return; /* Note down lines up to this change. */ notedown_sdiff_common_lines (first0, first1); /* Note down ``xxx | xxx '' lines */ if (changes == CHANGED) { for (i = first0, j = first1; i <= last0 && j <= last1; i++, j++) addnewelem (&internal_table, 3); changes = (i <= last0 ? OLD : 0) + (j <= last1 ? NEW : 0); next0 = first0 = i; next1 = first1 = j; } /* Note down `` > xxx '' lines */ if (changes & NEW) { for (j = first1; j <= last1; ++j) addnewelem (&internal_table, 2); next1 = j; } /* Note down ``xxx < '' lines */ if (changes & OLD) { for (i = first0; i <= last0; ++i) addnewelem (&internal_table, 1); next0 = i; } } numdiff-5.9.0/ChangeLog0000644000175000017500000012631413054341114014256 0ustar paologpaolog2017-02-19 Ivano Primi * Version 5.9.0 released. * bitvector.h, bitvector.c: Doc fixes. * config.h.in (VERSION): From 5.8.1 to 5.9.0. Doc fixes. * util.c (lines_differ): Signature changed: the parameter `argl' is now of type `const argslist*' instead of `argslist*'. (lines_differ): `ghostmask', `pblurmask', and `tblurmask' are now declared as pointers to `const unsigned' data. (lines_differ): `Ghostmask', `Pblurmask', and `Tblurmask' are now declared as pointers to `const unsigned' data. (lines_differ): getBitAtPosition() is now called on the mask of the command line options to if the bit _SI_MASK is on. * thrlist.c, read_line.c: Doc fixes. * options.c (print_version): Copyright statement updated. (print_help): Help message updated. (nfset): The bit fields corresponding to the command line options specified by the user are now set by calling setBitAtPosition(). (setargs): Added long option "raw". (setargs): The local variable `i' was renamed as `cmpRes'. All occurrences accordingly changed. (setargs): The local variable `w' is now initialized to the value DEF_ATMOST_NCOLS. (setargs): The initialization of the global variables `binary', `suppress_common_lines', `ignore_white_space', `expand_tabs', `speed_large_files' and `program_name' was moved to the function load_defaults() of main.c. (setargs): The structure pointed to by the argument `list' is now initialized in the function load_defaults() of main.c. (setargs): The bit fields corresponding to the command line options specified by the user are now set by calling setBitAtPosition(). (setargs): getBitAtPosition() is now called on the mask of the command line options to check if the bits _F_MASK and _SO_MASK are off. (setargs): The bit fields corresponding to the command line options `-B', `-T', `-F', `-c', `-l', `-o', and `--raw' are also set if appropriate. (setargs): getBitAtPosition() is now called on the mask of the command line options to check if any of the bits _SV_MASK, _B_MASK, _SO_MASK, _Q_MASK, and _RAW_MASK is on. (setargs): getBitAtPosition() is now called on the mask of the command line options to check if the bits _V_MASK and _H_MASK are off. Doc fixes. * numutil.c: Doc fixes. * numdiff.h: Include "bitvector.h". The field `optmask' of the structure `argslist' is now of type `bitvector'. New structure `difference_location'. New structure `statlist'. The fields `Labserr', `Crelerr', `Lrelerr', `Cabserr', `N1abserr', `N1disperr', `N2abserr', `N2disperr', `Nentries', and `Ndisperr' were moved from the structure `argslist' to the structure `statlist'. The _*_MASK macros were redefined as enumeration values. Enumeration values _ST_MASK, _SB_MASK, _SD_MASK, _SF_MASK, _C_MASK, and _RAW_MASK were introduced. New enumeration value MAX_NUMDIFF_OPTIONS. The OUTMODE_* macros were redefined as enumeration values. Enumeration value OUTMODE_RAW was introduced. The macros CLASSIC_FORMULA, WR_TO_FIRST_FILE, and WR_TO_SECOND_FILE were redefined as enumeration values. The declarations of the functions diff_2_files(), read_files(), and lines_differ() were adjusted to comply with the new signatures. Doc fixes. * new.c: Doc fixes. * ndselect.h: Include "bitvector.h". The field `optmask' of the structure `Argslist' is now of type `bitvector'. The ___*_MASK macros were redefined as enumeration values. Enumeration values ___L_MASK and ___O_MASK were introduced. New enumeration value MAX_NDSELECT_OPTIONS. Doc fixes. * ndselect.c (print_selversion): Copyright statement updated. (scan_file): getBitAtPosition() is now called on the mask of the command line options to determine whether the bit ___X_MASK is on or off. (set_args): The field `optmask' of the structure pointed to by `list' is now initialized by means of a call to newBitVector(). (set_args): The bit fields corresponding to the command line options specified by the user are now set by calling setBitAtPosition(). (set_args): To check if the bits ___H_MASK and ___V_MASK are off, getBitAtPosition() is now called on the mask of the command line options. (main): New boolean variables `pHelp' and `pVersion' of type `int'. (main): getBitAtPosition() is called on the mask of the command line options to check if the bit ___H_MASK is on, then `pHelp' is initialized with the result of this check. (main): getBitAtPosition() is called on the mask of the command line options to check if the bit ___V_MASK is on, then `pVersion' is initialized with the result of this check. (main): The information about version number, copyright, and distribution terms of Numdiff is now printed if `pVersion' is non-zero. (main): The help text of Numdiff is now printed if `pHelp' is non-zero. (main): The determination of the exit code of the program when any of the options `--help' and `--version' is specified was made more compact by means of the operator `?:'. Doc fixes. * main.c: Extern declaration of cmp_files() changed according to the new signature of the function. (load_defaults): New static function. (init_mpa_support): Signature changed: new parameter `statres' of type `statlist*'. All callers changed. (init_mpa_support): Since the fields `Labserr', `Crelerr', `Lrelerr', `Cabserr', `N1abserr', `N1disperr', `N2abserr', `N2disperr' were moved from the structure `argslist' to the new structure type `statlist', they are initialized now via the pointer `statres'. (dismiss_mpa_support): Signature changed: new parameter `statres' of type `statlist*'. All callers changed. (dismiss_mpa_support): The memory allocated for the fields `Labserr', `Crelerr', `Lrelerr', `Cabserr', `N1abserr', `N1disperr', `N2abserr', and `N2disperr' is now freed by referring to them via the pointer `statres'. (compare_files): Signature changed: the parameter `list' is now of type `const argslist*' instead of `argslist*'. (isLocationDefined): New static function. (print_statistics): Signature changed: the parameter `list' is now of type `const argslist*' instead of `argslist*', new parameter `statres' of type `statlist*'. All callers changed. (print_statistics): Since the fields `Labserr', `Crelerr', `Lrelerr', `Cabserr', `N1abserr', `N1disperr', `N2abserr', `N2disperr', `Nentries', and `Ndisperr' were moved from the structure `argslist' to the new structure type `statlist', they are accessed now via the pointer `statres'. (print_statistics): Many of the messages printed to standard output were corrected. (print_statistics): If the compared files show numeric differences which are important to the user, the locations of the occurrences of the largest absolute difference are printed to standard output, as well as the locations of the occurrences of the largest relative difference. (clean_memory): New static function. (main): New variable `statres' of type `statlist', new boolean variables `pHelp' and `pVersion' of type `int'. (main): To initialize the structures `list' and `statres' with reasonable defaults, load_defaults() is called immediately before calling init_mpa_support(). (main): If setargs() fails, the new function clean_memory() is now called before exiting to free the memory dynamically allocated for some structures. (main): getBitAtPosition() is called on the mask of the command line options to check if the bit _H_MASK is on, then `pHelp' is initialized with the result of this check. (main): getBitAtPosition() is called on the mask of the command line options to check if the bit _V_MASK is on, then `pVersion' is initialized with the result of this check. (main): The information about version number, copyright, and distribution terms of Numdiff is now printed if `pVersion' is non-zero. (main): The help text of Numdiff is now printed if `pHelp' is non-zero. (main): If the user has requested the help text or the information about version number, copyright, and distribution terms of Numdiff, the new function clean_memory() is now called before exiting to free the memory dynamically allocated for some structures. (main): The determination of the exit code of the program when any of the options `--help' and `--version' is specified was made more compact by means of the operator `?:'. (main): getBitAtPosition() is called on the mask of the command line options to check if the bit _Q_MASK is on. (main): If open_files() fails, the new function clean_memory() is now called before exiting to free the memory dynamically allocated for some structures. (main): getBitAtPosition() is called on the mask of the command line options to check if one or more of the bits _F_MASK, _Z_MASK, or _SZ_MASK is on. (main): If the function compare_files() has returned a negative value, clean_memory() and close_files() are called before exiting. (main): getBitAtPosition() is now called on the mask of the command line options to check if the bit _F_MASK is off. (main): If any of the functions rewind_files() and set_file_pointers() has returned a value different from EXIT_SUCCESS, the new function clean_memory() is now called before exiting to free the memory dynamically allocated for some structures. (main): getBitAtPosition() is now called on the mask of the command line options to check if the bit _SS_MASK is on. (main): In case of normal termination of the program, the new function clean_memory() is now called before exiting to free the memory dynamically allocated for some structures. Doc fixes. * linesplit.h, linesplit.c: Doc fixes. * io.c (print_errors): Signature changed: new parameter `human_readable_format' of type `int'. All callers changed. (print_errors): The old way of printing errors is now used only if `human_readable_format' is true: if `human_readable_format' is false, errors are printed in raw format. Doc fixes. * inout.c (find_and_hash_each_line): Signature changed: the parameter `argl' is now of type `const argslist*' instead of `argslist*'. (find_and_hash_each_line): getBitAtPosition() is now called on the mask of the command line options to check if the bit _SI_MASK is on. (find_and_hash_each_line): The local variables `ghostmask', `pblurmask' and `tblurmask' are now of type `const unsigned char*' instead of `unsigned char*'. (read_files): Signature changed: the parameter `argl' is now of type `const argslist*' instead of `argslist*'. (read_files): The local variables `ifs1' and `ifs2' are now of type `const char**' instead of `char**'. (read_files): `ifs1' and `ifs2' are not any longer casted to `const char**' when calling find_and_hash_each_line(). * flags.c, errors.c: Doc fixes. * cmpfns.c: Extern declaration of print_errors() changed according to the new signature of the function. (cmp_fields): Signature changed: the parameter `argl' is now of type `const argslist*' instead of `argslist*', new parameter `statres' of type `statlist*', new parameters `Labserr_exceeded' and `Rabserr_exceeded' of type `int*'. All callers changed. (cmp_fields): getBitAtPosition() is now called on the mask of the command line options to check if the bit _2_MASK is off. (cmp_fields): getBitAtPosition() is now called on the mask of the command line options to check if the bit _SS_MASK is on. (cmp_fields): getBitAtPosition() is now called on the mask of the command line options to check if the bit _SI_MASK is on. (cmp_fields): The results of the statistic analysis are not any longer stored in the structure pointed to by `argl', but in the structure pointed to by `statres'. (cmp_fields): The integer variable pointed to by `Labserr_exceeded' is set to one if the computed absolute error exceeds the current value of the largest absolute error, or if these two values are equal but the computed relative error exceeds the relative error associated to the current value of the largest absolute error. (cmp_fields): The integer variable pointed to by `Rabserr_exceeded' is set to one if the computed relative error exceeds the current value of the largest relative error, or if these two values are equal but the computed absolute error exceeds the absolute error associated to the current value of the largest relative error. (cmp_lines): Signature changed: the integer parameter `output_mode' was removed, the parameter `argl' is now of type `const argslist*' instead of `argslist*', new parameter `statres' of type `statlist*'. All callers changed. (cmp_lines): New local integer variable `output_mode', which is initialized with the value passed through the `argslist' structure. (cmp_lines): Added output instructions in raw output mode for the case of a line only present in one of the compared files. (cmp_lines): New local integer (boolean) variables `Labserr_exceeded' and `Rabserr_exceeded'. (cmp_lines): Before calling cmp_fields(), `Labserr_exceeded' and `Rabserr_exceeded' are both initialized to zero. (cmp_lines): If `Labserr_exceeded' is non-zero after calling cmp_fields(), the current line numbers and field numbers are stored in the structure `statres->Labserr_location'. (cmp_lines): If `Rabserr_exceeded' is non-zero after calling cmp_fields(), the current line numbers and field numbers are stored in the structure `statres->Rabserr_location'. (cmp_lines): getBitAtPosition() is now called on the mask of the command line options to check if the bit _SE_MASK is on. (cmp_lines): getBitAtPosition() is now called on the mask of the command line options to check if the bit _SU_MASK is on. (cmp_lines): Added output instructions to mark corresponding fields as different when the output mode is raw. (cmp_lines): Added output instruction in raw output mode for the case of a line in the second file which is shorter than the corresponding line from the first file. (cmp_lines): Added output instruction in raw output mode for the case of a line in the first file which is shorter than the corresponding line from the second file. (cmp_files): Signature changed: the parameter `argl' is now of type `const argslist*' instead of `argslist*', new parameter `statres' of type `statlist*'. All callers changed. Doc fixes. * arith.c: Doc fixes. * analyze.c (diff_2_files): The last argument is now a pointer to a constant argslist since the function does not change the pointed structu (diff_2_files): The value of the bit _M_MASK is now retrieved by calling getBitAtPosition() on the mask of the command line options. (diff_2_files): getBitAtPosition() is now called on the mask of the command line options to check if the bit _F_MASK is on. 2016-12-31 Ivano Primi * bitvector.c, bitvector.h: New file. 2013-09-15 Ivano Primi * Version 5.8.1 released. * config.h.in (VERSION): From 5.8.0 to 5.8.1. * NEWS: Added news for version 5.8.1. * Makefile.in (VERSION): From 5.8.0 to 5.8.1. 2013-08-28 Ivano Primi * Version 5.8.0 released. * BUGS: Doc fixes. * BUGS: Added description of the bug discovered by Elias Pipping and a hint on how to avoid it. 2013-08-26 Ivano Primi * INSTALL: Doc fixes. * BUGS: Added remind: specify if the operating system is either 32- or 64-bit. * NEWS: Added news for version 5.8.0. 2013-08-25 Ivano Primi * util.c: Added instruction to include linesplit.h Added declaration of the external variable def_ifs. (lines_differ): ifs and Ifs redefined as const char**. (lines_differ): IFS replaced by def_ifs. (lines_differ): for cycle to initialize f1 and let it point to the first field of s1 replaced by a call to string_spn(). (lines_differ): for cycle to initialize f2 and let it point to the first field of s2 replaced by a call to string_spn(). (lines_differ): Every couple of for cycles to move f1 to the beginning of the next field has been replaced by a call to string_cspn() and a call to string_spn(). (lines_differ): Every couple of for cycles to move f2 to the beginning of the next field has been replaced by a call to string_cspn() and a call to string_spn(). (lines_differ): for cycle to set e1 and let it point to the end of the field pointed to by f1 replaced by a call to string_cspn(). (lines_differ): for cycle to set e2 and let it point to the end of the field pointed to by f2 replaced by a call to string_cspn(). (lines_differ): The instructions f1 = e1; f2 = e2; have been removed from block of else if ((f1_is_blurred)) . (lines_differ): The instructions f1 = e1; f2 = e2; have been removed from `else' block of if ( (compare_numeric_strings (f1, pnf, f2, Pnf)) ) . (lines_differ): for cycle to move f1 from the end of a field to the beginning of the next field replaced by a call to string_spn(). (lines_differ): for cycle to move f2 from the end of a field to the beginning of the next field replaced by a call to string_spn(). 2013-08-22 Ivano Primi * thrlist.c, README: Doc fixes. * read_line.c: [_TEST_READ_LINE_]: Added instructions to include stdio.h, stdlib.h, and string.h [_TEST_READ_LINE_]: New macro constant BUFF_SIZE [_TEST_READ_LINE_]: New macro constants for error codes: OK, LINE_INTERR, EOF_REACHED, READING_ERROR, OUT_OF_MEMORY, OPEN_FAILED, WRONG_USAGE, FILE_IS_BINARY. (read_line): New variables n, ch, exception_occurred. (read_line): Cycle while ((ptr = fgets (buffer, BUFF_SIZE,pf))) { ... } replaced by do { ... } while (!exception_occurred); (do not rely anymore on function fgets() to read input lines, but use getc()). (read_line): Test if(!ptr) replaced by if ((exception_occurred)) . (read_line): Added test else if ( ch == '\0' ) . If the condition is true, *errcode is set to FILE_IS_BINARY. [_TEST_READ_LINE_] (main): New function. Doc fixes. * options.c: Added instruction to include linesplit.h (print_version): Fixed copyright string. (print_help): New help entry for options --delimiters, help message for option -s improved. (print_help): Since the short option for --dummy is not -D anymore but -U, the format strings for a couple of printf() calls have been changed. (return_ifs): function removed. (setargs): Changed initialization of optstring. (setargs): Since the short option for --dummy is not -D anymore but -U, the entry for the option "dummy" in the array long_options has been changed. (setargs): Since the short option for --dummy is not -D anymore but -U, the label of the corresponding case in switch (optch){...} is now 'U' instead of 'D'. (setargs): _SD_MASK replaced by _SU_MASK. (setargs): Long option "separator" changed to "separators". (setargs): Added entry for option "delimiters" to the array long_options. (setargs): Instead of using xstrdup(), list->nf1.currency and list->nf2.currency are now initialized by means of a call to get_separating_string(). (setargs): The memory reserved for list->ifs1 and list->ifs2 is now freed by calling delete_string_vector() instead of free(). (setargs): ssplit_former_way() is now used in place of return_ifs(). (setargs): Added if statements to print a suitable error message and return -1 in case ssplit_former_way() returns NULL (to indicate a failure). (setargs): To check for the presence of the newline character in list->ifs1 and list->ifs2 the function is_string_in_vector() is used in place of strchr(). (setargs): Before `adding' _S_MASK to list->optmask, the functions remove_duplicates_from_string_vector() and sort_string_vector() are called on list->ifs1 and list->ifs2. (setargs): Added case D to switch statement. (setargs): In case c the function get_separating_string() is now used in place of xstrdup() to set list->nf1.currency and list->nf2.currency. Doc fixes. 2013-08-18 Ivano Primi * numutil.c: Doc fixes. * numdiff.h (FILE_IS_BINARY): New macro. (argslist): Changed declaration of the fields ifs1 and ifs2. (_SD_MASK): Macro removed. (_SU_MASK): New macro. (IFS): Macro removed. Doc fixes. * new.c: Doc fixes. * ndselect.h (Argslist): Changed declaration of field ifs. (Argslist): New field osep. New macros ___SD_MASK and ___SO_MASK. Redefinition of macros ___X_MASK and ___V_MASK. Doc fixes. * ndselect.c: Added instruction to include linesplit.h. (return_ifs): function removed. (print_line): Signature and definition changed. All callers changed. (print_line): strspn() and strcspn() replaced by string_spn() and string_cspn() respectively. (print_line): The setting of the variable stop depends now on the value of the variable osep. (print_line): If osep is not NULL, it is printed to the standard output after every selected field. (scan_file): Signature and definition changed. All callers changed. (scan_file): Definition of ifs changed. (scan_file): IFS replaced by def_ifs. (scan_file): calls to print_line() changed. (print_selversion): Fixed copyright string. (print_selhelp): New help entries for options -D and -O, help message for option -S improved. (set_args): Changed initialization of optstring. (set_args): Added entries for options "delimiters" and "output-separator" to the array long_options. (set_args): Long option "separator" changed to "separators". (set_args): Added initialization code for list->osep. (set_args): The memory reserved for list.ifs is now freed by calling delete_string_vector() instead of free(), and after list->ifs is reinitialized to NULL. (set_args): ssplit_former_way() is now used in place of return_ifs(). (set_args): To check for the presence of the newline character in list->ifs the function is_string_in_vector() is used in place of strchr(). (set_args): Before `adding' ___SS_MASK to list->optmask, the functions remove_duplicates_from_string_vector() and sort_string_vector() are called on list->ifs. (set_args): Added cases D and O to switch statement. Added definition of static variable def_ifs. (clean_up_memory): New function. (main): def_ifs is properly initialized by means of a call to ssplit(). (main): clean_up_memory() is registered through atexit() to be called at process termination. (main): If either the call to atexit() or the initialization of def_ifs fails, the program exits after printing a suitable error message. (main): Changed call to scan_file(). Doc fixes. * Makefile.in (VERSION): From 5.6.1 to 5.8.0. (OBJECTS): Added ./linesplit.o. (OBJECTSONE): Added ./linesplit.o. (OBJECTSTWO): Added ./linesplit.o. (SOURCESONE): Added $(srcdir)/linesplit.c. (SOURCESTWO): Added $(srcdir)/linesplit.c. (copy): Added commands to copy $(srcdir)/linesplit.c and $(srcdir)/linesplit.h. Doc fixes. * main.c: Added instruction to include linesplit.h. Added definition of the external variable def_ifs. (main): def_ifs is properly initialized by calling the function ssplit(), added if statement to check for the successful initialization. (main): The memory reserved for list.ifs1 and list.ifs2 is now freed by calling delete_string_vector() instead of free(). (main): Before exiting the program, the function delete_string_vector() is called to free the memory previously reserved for def_ifs. (main): variable test is now initialized to 0 instead of -1. (main): If the call to open_files() fails, the memory is cleaned now before exiting the program. (main): If compare_files() returns a negative value, the program now exits after printing a suitable error message. (main): Now, if either rewind_files() or set_file_pointers() fails, the memory is cleaned and all files are properly closed before exiting the program. Doc fixes. * io.c, INSTALL: Doc fixes. * inout.c: Added instruction to include linesplit.h. (find_and_hash_each_line): Signature and definition changed, all callers changed. (find_and_hash_each_line): for cycle to initialize p and let it point to the first field replaced by a call to string_spn(). (find_and_hash_each_line): for cycle to initialize eof replaced by a call to string_cspn(). (find_and_hash_each_line): for cycle to move p to the beginning of the next field replaced by a call to string_spn(). Added declaration of the external variable def_ifs. (read_files): ifs1 and ifs2 redefined as char**. (read_files): IFS replaced by def_ifs. (read_files): call to find_and_hash_each_line() changed. Doc fixes. * flags.c, errors.c: Doc fixes. * configure.ac: AC_INIT(...): From version 5.6 to 5.8. Doc fixes. * config.h.in (VERSION): From 5.6.1 to 5.8.0. Doc fixes. * cmpfns.c: Added instruction to include linesplit.h. (cmp_lines): Signature and definition changed. All callers changed. (cmp_lines): New local variables end_field1, end_field2. (cmp_lines): strspn() and strcspn() replaced by string_spn() and string_cspn(), respectively. (cmp_lines): _SD_MASK replaced by _SU_MASK. Added declaration of the external variable def_ifs. (cmp_files): ifs1 and ifs2 redefined as char**. (cmp_files): IFS replaced by def_ifs. (cmp_files): Changed calls to cmp_lines(). (cmp_files): The if condition catching any error occurred while comparing corresponding lines has been extended: the error FILE_IS_BINARY is also caught now. (cmp_files): A suitable error message is printed if one of the two compared files is binary. (cmp_files): Message for reading error fixed. (cmp_files): Format of error message fixed. Doc fixes. * AUTHORS, arith.c: Doc fixes. * analyze.c (diff_2_files): The instruction which sets the value of the variable changes has been modified to ensure that the returned value is either 0 or 1. 2013-07-11 Ivano Primi * linesplit.h, linesplit.c: New file. 2012-02-22 Ivano Primi * Version 5.6.1 released. * config.h.in (VERSION): From 5.6.0 to 5.6.1. * Makefile.in: VERSION changed to 5.6.1. * NEWS: Added news for version 5.6.1. * Makefile.in (installdirs): Added $(MKDIR) $(DESTDIR)$(MANDIR). 2012-02-12 Ivano Primi * Version 5.6.0 released. * side.c (display_half_line): label control_char replaced by control_character. 2012-02-05 Ivano Primi * NEWS: Dox fixes. * main.c (compare_files): Newline not any more printed, since it makes the report unclear. * inout.c (_DEBUG_HASHING_): New Macro. _DEBUG_ has been replaced by _DEBUG_HASHING_. (find_and_hash_each_line): Fixed improper handling of a file whose last line does not have a trailing newline (bucket[-1] no longer used). (find_and_hash_each_line): Bug fix imported from GNU Diffutils 3.0. (find_and_hash_each_line)[_DEBUG_HASHING_]: Added code for debug. (find_identical_ends): Bug fix imported from GNU Diffutils 3.0. * flags.c: (notedown_sdiff_script)[_DEBUG_FLAGSTABLE_]: New debug instruction. * cmpfns.c (cmp_files): Fixed improper handling of files whose last line does not have a trailing newline in case filter is on. * numdiff.h (_DEBUG_HASHING_): New Macro. _DEBUG_ has been replaced by _DEBUG_HASHING_. * options.c (print_help): two help entries fixed. 2012-01-05 Ivano Primi * ndselect.c (print_selhelp): Several fixes to help entries. * options.c (print_help): Several fixes to help entries. * cmpfns.c (cmp_lines): New constant fieldno_upper_limit, set to 8*FIELDMASK_SIZE. (cmp_lines): Constant value 8*FIELDMASK_SIZE replaced everywhere by fieldno_upper_limit. 2012-01-03 Ivano Primi * NEWS: Doc fixes. * ndselect.c (print_line): Signature changed. All callers changed. (print_line): Added if-else statement based on the value of the variable omit_if_empty. (scan_file): New variable omit_empty_lines, added initialization code. (print_selhelp): New help entry for option `-x', help message improved. (set_args): Changed initialization of optstring. (set_args): Added entry for option "omit-empty-lines" to the array long_options. (set_args): Added case 'x' to switch statement. * ndselect.h (___X_MASK): New macro. (___V_MASK): The value of this macro has been changed. 2012-01-02 Ivano Primi * Makefile.in (MANFILETWO): changed description of the manpage. * NEWS: Doc fixes. * options.c (print_help): New help entry for option -F, other help messages improved. (setargs): Changed initialization of optstring. (setargs): Added entry for option "formula" to the array long_options. (setargs): Added case 'F' to switch statement. (setargs): Removed initial if-else if-else statement from case 'r', replaced by a single call to thrlist_add. (setargs): Parentheses have been written around operator &. * numdiff.h: Doc fixes. * ndselect.h (Argslist): New fields first_field, last_field, increment, and ifs. (___SF_MASK ___SL_MASK ___SI_MASK ___SS_MASK): New macros. (___V_MASK): The value of this macro has been changed. Doc fixes. * ndselect.c (return_ifs): New function, copied from options.c. (we_can_go_on): New function. (print_line): New function. (scan_file): New variable ifs, then added initialization code for ifs. (scan_file): call to fputs replaced by call to print_line (done twice). (print_selhelp): New help entries for options -F, -L, -I and -S, other help messages improved. (set_args): Changed initialization of optstring. (set_args): Added entries for "first-field", "last-field", "increment" and "separator" options to the array long_options. (set_args): Added initialization code for list->first_field, list->last_field, list->increment and list->ifs. (set_args): Added cases F, L, I and S to switch statement. Doc fixes. 2011-12-31 Ivano Primi * util.c (lines_differ): New constant fieldno_upper_limit, set to 8*FIELDMASK_SIZE. (lines_differ): 8*FIELDMASK_SIZE replaced by fieldno_upper_limit everywhere. (lines_differ): Error message "Line \"%s\"\ncontains too many fields!\n" replaced by a clearer explanation, which is sent to stderr through fprintf. * thrlist.c (defaults): Added field CURRENCY. (thrlist_new): list->beg1, list->beg2, and list->end1, list->end2 are initialized now with 0 and FIELDNO_MAX - 1 respectively. (thrlist_new): list->double_range_spec is set to zero. (set_interval): *b and *e are set now to beg-1 and end-1 respectively. (set_intervals): Signature has been changed. All callers changed. (set_intervals): Added code to set the variable pointed to by dbl_rng_spec. (thrlist_add): New variable dbl_rng_spec. (thrlist_add): beg1, beg2, and end1, end2 are initialized now with 0 and FIELDNO_MAX - 1 respectively. (thrlist_add): pnode->double_range_spec set to dbl_rng_spec. (thrlist_cmp): The value returned by this function depends now also on the value of pnode->double_range_spec. Doc fixes. * options.c (print_version): Copyright statement updated. (print_help): Help strings have been updated or improved. New help entries for options `-c' and `-B'. Added instruction to display the default value of the currency name. (VALID_NUMFMT INVALID_NUMFMT INVALID_CURRENCY): New macros. (valid_numfmt): Name changed to is_numfmt_valid. All callers changed. (valid_numfmt): New variable ptr. (valid_numfmt): Macros VALID_NUMFMT, INVALID_NUMFMT and INVALID_CURRENCY are used in the 'return' statements in place of hardcoded integer values. (valid_numfmt): Added code to check the validity of the string pointed to by pnf->currency. (setargs): New constant mask_size, defined as FIELDMASK_SIZE*8. (setargs): modified string pointed to by optstring. (setargs): Added entries for "binary" and "currency" options to the array long_options. (setargs): New variables binary, rv and file_id. (setargs): Removed variable defaults. (setargs): Added initialization of variable binary. (setargs): Added initialization of list->nf*.currency. (setargs): Added cases 'B' and 'c' to switch statement. (setargs): FIELDMASK_SIZE*8 replaced by mask_size everywhere. (setargs)[USE_GMP]: Removed call to delR(), removed directive (done twice). (setargs): thrlist_add is used in place of str2R to add new elements to list->maxabserr and list->maxrelerr. Error handling consequently updated. (setargs): tests "if (!valid_numfmt(&list->nf*) )" replaced by "if ( (rv = is_numfmt_valid(&list->nf*)) == INVALID_NUMFMT )" (setargs): Added code to handle the cases when is_numfmt_valid returns INVALID_CURRENCY. Doc fixes. * numutil.c (anum): New variable length, used to store the length of the string pnf->currency. Added code to skip the currency name, if specified. (snum): New variable length, used to store the length of the string pnf->currency. Added code to skip the currency name, if specified. Doc fixes. * numdiff.h (currency): New variable. (maxabserr maxrelerr): Variable type has been changed. (CURRENCY): New macro. (binary): New variable. Doc fixes. * new.c (bc_a2num): New variable length, used to store the length of the string pnf->currency. Added code to skip the currency name, if specified. Doc fixes. * ndselect.c (print_selversion): Copyright statement updated. Doc fixes. * Makefile.in: VERSION set to 5.6.0. (mandir MANDIR HELP2MAN MANFILE MANFILETWO): New variables. (OBJECTSTWO): Added ./getopt1.o. (SOURCESTWO): Added $(srcdir)/getopt1.c. (man $(MANFILE) $(MANFILETWO)): New targets for creation of manpages. (install): Added installation of manpages. (uninstall): Added removal of files $(PACKAGE).1 and $(PACKAGETWO).1, i.e. removal of numdiff and ndselect manpages. (maintainer-clean): Added cleaning instructions for $(MANFILE) and $(MANFILETWO). (copy): Added instructions to copy $(MANFILE) and (MANFILETWO) from docs directory to tarball directory. * main.c (init_mpa_support): list->maxabserr and list->maxrelerr are now initialized through a call to thrlist_new(), instead of using initR(). (dismiss_mpa_support): list->maxabserr and list->maxrelerr are now disposed through a call to thrlist_dispose(), instead of using delR(). (main): variable defaults removed. Doc fixes. * configure.ac: AC_INIT(...): From version 5.2 to 5.6. * NEWS: Added news for version 5.6.0. 2011-12-30 Ivano Primi * README, read_line.c, ndselect.h, io.c, INSTALL: Doc fixes. * inout.c (find_and_hash_each_line): New constant fieldno_upper_limit, set to FIELDMASK_SIZE*8. (find_and_hash_each_line): Added test "fieldno < fieldno_upper_limit" to for cycle. (find_and_hash_each_line): Added error handling in case fieldno >= fieldno_upper_limit. * flags.c, errors.c: Doc fixes. * configure.ac: AC_CHECK_LIB(gmp, __gmpz_init): Do not search for the GMP library if its use has been turned off through --disable-gmp or --enable-gmp=no. AC_CHECK_LIB(intl, setlocale): If the support for NLS is on, search for the function setlocale in libintl (this fixes building bug under Cygwin). Doc fixes. * config.h.in: VERSION changed to 5.6.0. Doc fixes. * cmpfns.c (cmp_fields): Signature changed. All callers changed. (cmp_fields): Calls to cmp replaced by calls to thrlist_cmp. (cmp_lines): Error message "@ Line %lu in file \"%s\" contains too many fields!\n" replaced by a clearer message. (cmp_files): Error message "\n*** End of file \"%s\" reached while trying to read line %lu.\n" replaced by clearer message. Doc fixes. * AUTHORS, arith.c: Doc fixes. 2011-10-30 Ivano Primi * Makefile.in (OBJECTS OBJECTSONE): Added ./thrlist.o. (SOURCESONE): Added source $(srcdir)/thrlist.c. (copy): Added instruction to copy thrlist.c from source directory to tarball directory. * numdiff.h (THRLIST_OK THRLIST_INVALID_FORMAT THRLIST_INVALID_RANGES): New macros. (__thrlist_node): New struct. (thrlist_node): Alias for __thrlist_node. (thrlist): Alias for thrlist_node*. (thrlist_new thrlist_add thrlist_cmp thrlist_dispose): Added declarations. * thrlist.c: New file. 2011-10-01 Ivano Primi * side.c (display_half_line): New function. (print_1overview_line): New function. * options.c (print_help): New help entry for option -O. (setargs): modified string pointed to by optstring. (setargs): Added entry for "overview" option to the array long_options. (setargs): Added case O to switch statement. (setargs): Added code to initialize list->output_mode to OUTMODE_OVERVIEW. * numdiff.h (_SO_MASK): New macro for option -O. (_SS_MASK _SI_MASK _SH_MASK _M_MASK _V_MASK): The values of these macros have been changed. (OUTMODE_OVERVIEW): New macro. (print_1overview_line): Added declaration. Doc fixes. * Makefile.in: VERSION changed to 5.3.0. * config.h.in: VERSION set to 5.3.0. * cmpfns.c (cmp_files): Addition of code for the implementation of the overview mode, i.e. added calls to the function print_1overview_line. In case the compared files are equal, print_1overview_line is called only if suppress_common_lines is false (0). 2010-01-24 Ivano Primi Version 5.2.1 released. 2010-01-24 Ivano Primi * Makefile.in: VERSION changed to 5.2.1. * config.h.in (VERSION): From 5.2.0 to 5.2.1. * NEWS: Added news for version 5.2.1. * system.h: [!ENABLE_NLS] (ngettext): Macro definition. 2010-01-07 Ivano Primi Version 5.2.0 released. 2010-01-07 Ivano Primi * util.c: Doc fixes. * util.c: New file. * side.c: Doc fixes. * side.c: New file. * inout.c: Doc fixes. * inout.c: New file. * analyze.c: Doc fixes. * analyze.c: New file. * number.c: Doc fixes. * options.c: (print_version) [!USE_GMP]: Message string fixed. (print_help): Message string fixed. 2010-01-06 Ivano Primi * NEWS, INSTALL: Doc fixes. 2010-01-05 Ivano Primi * ndselect.c (print_selversion): Fixed Copyright string. * read_line.c: Doc fixes. * options.c: Doc fixes. (print_version): Fixed Copyright string. * numutil.c, numdiff.h, number.c: Doc fixes. * number.c: New file. * new.c, ndselect.h: Doc fixes. * ndselect.h: New file. * ndselect.c, main.c, io.c, flags.c: Doc fixes. * flags.c: New file. * errors.c, configure.ac, config.h.in, cmpfns.c, arith.c, README: Doc fixes. * README: New file. * Makefile.in, INSTALL: Doc fixes. * INSTALL, BUGS: New file. * AUTHORS: Doc fixes. * AUTHORS: New file. 2010-01-03 Ivano Primi * ndselect.c: [USE_GMP]: Removed zalloc. string.h and numutil.c are not anymore included. Removed declaration of read_line. Include read_line.c. * Makefile.in (SOURCESONE): Added $(srcdir)/read_line.c. (OBJECTSTWO): Removed ./arith.o and ./io.o. (SOURCESTWO): Removed $(srcdir)/arith.c and $(srcdir)/io.c. Added $(srcdir)/read_line.c. (copy): Added instruction to copy read_line.c from source directory to tarball directory. * io.c: Doc-fixes: Removed unuseful comments. (read_line): Moved to file read_line.c. Added instruction to include read_line.c. * read_line.c, io.c: New file. * arith.c: [USE_GMP] (str2C): Replaced isspace by is_space. Replaced '+' by POS_SIGN and '-' by NEG_SIGN. [!USE_GMP] (str2C): Replaced isspace by is_space. Replaced '+' by POS_SIGN and '-' by NEG_SIGN. * ndselect.c (setargs): Replaced isspace by is_space. * numdiff.h (is_digit, is_punct, is_print): Macro re-definition. (is_space): Macro definition. The macro isspace has been replaced everywhere by is_space. * system.h: New file. * numutil.c (anum, snum): Replaced toupper by TOLOWER. (anum, acxnum, snum, scxnum): Replaced isspace by is_space. * cmpfns.c (strNcasecmp): Replaced tolower by TOLOWER. * new.c (bc_a2num): Replaced toupper by TOLOWER. Replaced isspace by is_space. * new.c: New file. 2009-12-30 Ivano Primi * NEWS: Added news for version 5.2.0. * NEWS: New file. * configure.ac: New option --enable-gmp / --disable-gmp. Usage of GNU MP is enabled by default. * arith.c: HAVE_LIBGMP has been replaced by USE_GMP. (Epsilon, MEpsilon): Removed. (mpa_define_epsilon, mpa_undef_epsilon): Removed. [USE_GMP] (init_mpa): Signature and definition (argument iscale is used in place of MAX_ISCALE) changed. All callers in other files changed. [!USE_GMP] (init_mpa): Signature changed. All callers in other files changed. (copyR, copyC): Signature and definition changed. All callers in other files changed. [USE_GMP] (str2R, str2C): Calls to mpf_a2num() changed. (cmp, is0): Signature and definition changed. All callers in other files changed. [USE_GMP] (fprintno): Test (u == Inf) has been correctly rewritten. [USE_GMP] (end_mpa): Variable Inf is also cleared now. * main.c (init_mpa_support): Call to init_mpa() changed. (print_statistics) [USE_GMP]: Added code to initialize qm_abserr and qm_relerr. (print_statistics): Removed commented out old code. (print_statistics): Changed calls to copyR(). (main): Removed calls to mpa_define_epsilon() and mpa_undef_epsilon(). * ndselect.c: [USE_GMP] (zalloc): New function. [USE_GMP]: Include numutil.c. * options.c: (print_version) [USE_GMP]: Added statement on the way the program has been built. (print_version) [!USE_GMP]: Modified statement on the way the program has been built. (set_args) [!USE_GMP]: Removed code to avoid memory leak (not needed in this case and even dangerous). * errors.c (out_of_memory): Added missing argument in the call to fprintf(). * numutil.c: HAVE_LIBGMP has been replaced by USE_GMP. [USE_GMP](mpf_a2num): The case when the number returned by snum() is zero is now correctly handled. * cmpfns.c (cmp, is0, copyR): Calls changed. * numdiff.h (USE_GMP): New Macro. HAVE_LIBGMP has been replaced by USE_GMP. (MAX_EPXN, MIN_EXPN): They are now constant values of 'long int' type. (cmp, is0, init_mpa, copyR, copyC): Redefinition of signature. All callers changed. (mpa_define_epsilon, mpa_undef_epsilon): Removed. * errors.c, options.c, ndselect.c, main.c, cmpfns.c: New file. 2009-12-29 Ivano Primi * configure.ac: AC_INIT(...): From version 5.0 to 5.2. * config.h.in (HAVE_LIBGMP): New Macro. (HAVE_LOCALECONV): New Macro. (VERSION): From 5.0.0 to 5.2.0. * Makefile.in: VERSION changed to 5.2.0. * config.h.in: New file. * numutil.c: [HAVE_LIBGMP] (mpf_a2num): Bug fixes after running a text program. * numutil.c: [HAVE_LIBGMP] (mpf_a2num): Removed memory leak + Doc fixes. * arith.c: [HAVE_LIBGMP] (fprintno): Memory leak removed 2009-12-28 Ivano Primi * numutil.c: [HAVE_LOCALECONV && HAVE_LIBGMP]: Include locale.h. [HAVE_LIBGMP] (mpf_a2num): New function. * numutil.c: New file. * configure.ac: AC_CHECK_FUNCS(...): Check for localeconv added. * numdiff.h (CHAR_ONE CHAR_NINE): Macro definition. [HAVE_LIBGMP] (mpf_a2num): Declaration. * arith.c: [HAVE_LIBGMP] (round_far_from_zero fprintno): New functions. [HAVE_LIBGMP] (printno, debug_printno): Transformed into wrappers of the function fprintno. [HAVE_LIBGMP] (str2R): Call to mpf_a2num changed in view of the actual definition of this function. * arith.c: [HAVE_LIBGMP] (Zero, Ten, Inf, Epsilon, MEpsilon): Definition of variables. [HAVE_LIBGMP] (init_mpa, mpa_define_epsilon, initR, initC, copyR, copyC) (str2R, str2C, add, square, divide, divide_by_int, square_root) (Cabs, Csub, cmp, is0, smart_cmp, printno, debug_printno) (delR, delC, mpa_undef_epsilon, end_mpa): New functions. [!HAVE_LIBGMP] (copyR, copyC): Re-definition according to the new signature. * numdiff.h (copyR copyC): Redefinition of signature. All callers changed. 2009-12-13 Ivano Primi * Makefile.in: Added createdirs, copy and tarball targets. Target dist rewritten. * Makefile.in, arith.c: New file. 2009-12-12 Ivano Primi * numdiff.h: [HAVE_LIBGMP] (Real Complex): Definition of types. * numdiff.h: New file. * configure.ac: AC_CHECK_LIB(gmp, __gmpz_init): Check for GNUMP added. * configure.ac: New file. 2009-11-31 Ivano Primi Version 5.0.0 released. numdiff-5.9.0/m4/0000755000175000017500000000000013054341114013015 5ustar paologpaolognumdiff-5.9.0/m4/st_mtim.m40000644000175000017500000000341713054341114014740 0ustar paologpaolog# Copyright 1997, 2000, 2001 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. #serial 5 dnl From Paul Eggert. # Define ST_MTIM_NSEC to be the nanoseconds member of struct stat's st_mtim, # if it exists. AC_DEFUN([AC_STRUCT_ST_MTIM_NSEC], [AC_CACHE_CHECK([for nanoseconds member of struct stat.st_mtim], ac_cv_struct_st_mtim_nsec, [ac_save_CPPFLAGS="$CPPFLAGS" ac_cv_struct_st_mtim_nsec=no # tv_nsec -- the usual case # _tv_nsec -- Solaris 2.6, if # (defined _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED == 1 # && !defined __EXTENSIONS__) # st__tim.tv_nsec -- UnixWare 2.1.2 for ac_val in tv_nsec _tv_nsec st__tim.tv_nsec; do CPPFLAGS="$ac_save_CPPFLAGS -DST_MTIM_NSEC=$ac_val" AC_TRY_COMPILE([#include #include ], [struct stat s; s.st_mtim.ST_MTIM_NSEC;], [ac_cv_struct_st_mtim_nsec=$ac_val; break]) done CPPFLAGS="$ac_save_CPPFLAGS"]) if test $ac_cv_struct_st_mtim_nsec != no; then AC_DEFINE_UNQUOTED(ST_MTIM_NSEC, $ac_cv_struct_st_mtim_nsec, [Define to be the nanoseconds member of struct stat's st_mtim, if it exists.]) fi ] ) numdiff-5.9.0/m4/setmode.m40000644000175000017500000000246613054341114014727 0ustar paologpaolog# Check for setmode, DOS style. # Copyright (C) 2001, 2002 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. AC_DEFUN([AC_FUNC_SETMODE_DOS], [AC_CHECK_HEADERS(fcntl.h unistd.h) AC_CACHE_CHECK([for DOS-style setmode], [ac_cv_func_setmode_dos], [AC_TRY_LINK( [#include #if HAVE_FCNTL_H # include #endif #if HAVE_UNISTD_H # include #endif], [int ret = setmode && setmode (1, O_BINARY);], [ac_cv_func_setmode_dos=yes], [ac_cv_func_setmode_dos=no])]) if test $ac_cv_func_setmode_dos = yes; then AC_DEFINE(HAVE_SETMODE_DOS, 1, [Define to 1 if you have the DOS-style `setmode' function.]) fi]) numdiff-5.9.0/cmpbuf.h0000644000175000017500000000161313054341114014123 0ustar paologpaolog/* Buffer primitives for comparison operations. Copyright (C) 2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ size_t block_read (int, char *, size_t); size_t buffer_lcm (size_t, size_t, size_t); numdiff-5.9.0/error.c0000644000175000017500000001757213054341114014006 0ustar paologpaolog/* Error handler for noninteractive utilities Copyright (C) 1990-1998, 2000-2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by David MacKenzie . */ #if !_LIBC # include #endif #include "error.h" #include #include #include #include #if !_LIBC && ENABLE_NLS # include "gettext.h" #endif #ifdef _LIBC # include # include # include # include # define mbsrtowcs __mbsrtowcs #endif #if USE_UNLOCKED_IO # include "unlocked-io.h" #endif #ifndef _ # define _(String) String #endif /* If NULL, error will flush stdout, then print on stderr the program name, a colon and a space. Otherwise, error will call this function without parameters instead. */ void (*error_print_progname) (void); /* This variable is incremented each time `error' is called. */ unsigned int error_message_count; #ifdef _LIBC /* In the GNU C library, there is a predefined variable for this. */ # define program_name program_invocation_name # include # include # include /* In GNU libc we want do not want to use the common name `error' directly. Instead make it a weak alias. */ extern void __error (int status, int errnum, const char *message, ...) __attribute__ ((__format__ (__printf__, 3, 4))); extern void __error_at_line (int status, int errnum, const char *file_name, unsigned int line_number, const char *message, ...) __attribute__ ((__format__ (__printf__, 5, 6)));; # define error __error # define error_at_line __error_at_line # include # define fflush(s) INTUSE(_IO_fflush) (s) # undef putc # define putc(c, fp) INTUSE(_IO_putc) (c, fp) # include #else /* not _LIBC */ # if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P # ifndef HAVE_DECL_STRERROR_R "this configure-time declaration test was not run" # endif char *strerror_r (); # endif /* The calling program should define program_name and set it to the name of the executing program. */ extern char *program_name; # if HAVE_STRERROR_R || defined strerror_r # define __strerror_r strerror_r # endif /* HAVE_STRERROR_R || defined strerror_r */ #endif /* not _LIBC */ static void print_errno_message (int errnum) { char const *s; #if defined HAVE_STRERROR_R || _LIBC char errbuf[1024]; # if STRERROR_R_CHAR_P || _LIBC s = __strerror_r (errnum, errbuf, sizeof errbuf); # else if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0) s = errbuf; else s = 0; # endif #else s = strerror (errnum); #endif #if !_LIBC if (! s) s = _("Unknown system error"); #endif #if _LIBC __fxprintf (NULL, ": %s", s); #else fprintf (stderr, ": %s", s); #endif } static void error_tail (int status, int errnum, const char *message, va_list args) { #if _LIBC if (_IO_fwide (stderr, 0) > 0) { # define ALLOCA_LIMIT 2000 size_t len = strlen (message) + 1; wchar_t *wmessage = NULL; mbstate_t st; size_t res; const char *tmp; bool use_malloc = false; while (1) { if (__libc_use_alloca (len * sizeof (wchar_t))) wmessage = (wchar_t *) alloca (len * sizeof (wchar_t)); else { if (!use_malloc) wmessage = NULL; wchar_t *p = (wchar_t *) realloc (wmessage, len * sizeof (wchar_t)); if (p == NULL) { free (wmessage); fputws_unlocked (L"out of memory\n", stderr); return; } wmessage = p; use_malloc = true; } memset (&st, '\0', sizeof (st)); tmp = message; res = mbsrtowcs (wmessage, &tmp, len, &st); if (res != len) break; if (__builtin_expect (len >= SIZE_MAX / 2, 0)) { /* This really should not happen if everything is fine. */ res = (size_t) -1; break; } len *= 2; } if (res == (size_t) -1) { /* The string cannot be converted. */ if (use_malloc) { free (wmessage); use_malloc = false; } wmessage = (wchar_t *) L"???"; } __vfwprintf (stderr, wmessage, args); if (use_malloc) free (wmessage); } else #endif vfprintf (stderr, message, args); va_end (args); ++error_message_count; if (errnum) print_errno_message (errnum); #if _LIBC __fxprintf (NULL, "\n"); #else putc ('\n', stderr); #endif fflush (stderr); if (status) exit (status); } /* Print the program name and error message MESSAGE, which is a printf-style format string with optional args. If ERRNUM is nonzero, print its corresponding system error message. Exit with status STATUS if it is nonzero. */ void error (int status, int errnum, const char *message, ...) { va_list args; #if defined _LIBC && defined __libc_ptf_call /* We do not want this call to be cut short by a thread cancellation. Therefore disable cancellation for now. */ int state = PTHREAD_CANCEL_ENABLE; __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), 0); #endif fflush (stdout); #ifdef _LIBC _IO_flockfile (stderr); #endif if (error_print_progname) (*error_print_progname) (); else { #if _LIBC __fxprintf (NULL, "%s: ", program_name); #else fprintf (stderr, "%s: ", program_name); #endif } va_start (args, message); error_tail (status, errnum, message, args); #ifdef _LIBC _IO_funlockfile (stderr); # ifdef __libc_ptf_call __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0); # endif #endif } /* Sometimes we want to have at most one error per line. This variable controls whether this mode is selected or not. */ int error_one_per_line; void error_at_line (int status, int errnum, const char *file_name, unsigned int line_number, const char *message, ...) { va_list args; if (error_one_per_line) { static const char *old_file_name; static unsigned int old_line_number; if (old_line_number == line_number && (file_name == old_file_name || strcmp (old_file_name, file_name) == 0)) /* Simply return and print nothing. */ return; old_file_name = file_name; old_line_number = line_number; } #if defined _LIBC && defined __libc_ptf_call /* We do not want this call to be cut short by a thread cancellation. Therefore disable cancellation for now. */ int state = PTHREAD_CANCEL_ENABLE; __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), 0); #endif fflush (stdout); #ifdef _LIBC _IO_flockfile (stderr); #endif if (error_print_progname) (*error_print_progname) (); else { #if _LIBC __fxprintf (NULL, "%s:", program_name); #else fprintf (stderr, "%s:", program_name); #endif } #if _LIBC __fxprintf (NULL, file_name != NULL ? "%s:%d: " : " ", file_name, line_number); #else fprintf (stderr, file_name != NULL ? "%s:%d: " : " ", file_name, line_number); #endif va_start (args, message); error_tail (status, errnum, message, args); #ifdef _LIBC _IO_funlockfile (stderr); # ifdef __libc_ptf_call __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0); # endif #endif } #ifdef _LIBC /* Make the weak alias. */ # undef error # undef error_at_line weak_alias (__error, error) weak_alias (__error_at_line, error_at_line) #endif numdiff-5.9.0/configure.ac0000644000175000017500000001733313054341114014772 0ustar paologpaologdnl dnl Autoconf configuration script for Numdiff - version 5.x . dnl dnl Copyright 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi . dnl dnl Permission is granted to use, copy, modify, and redistribute this file as dnl needed. dnl dnl Process this file with autoconf to produce a configure script. dnl dnl -------------------------------------- dnl Minimal required version of dnl autoconf dnl -------------------------------------- dnl AC_PREREQ(2.62) dnl -------------------------------------- dnl Initialization dnl -------------------------------------- dnl AC_INIT(Numdiff, 5.9, , numdiff) AC_CONFIG_SRCDIR(numdiff.h) AC_CONFIG_HEADER(config.h) dnl -------------------------------------- dnl My own flags dnl -------------------------------------- dnl if test "x$DBGFLAGS" = "x"; then DBGFLAGS="-g" fi if test "x$OPTFLAGS" = "x"; then OPTFLAGS="-O" fi dnl -------------------------------------- dnl Getting environment variables dnl -------------------------------------- dnl CPPFLAGS="${CPPFLAGS:=}" CFLAGS="${CFLAGS:=}" LDFLAGS="${LDFLAGS:=}" LIBS="${LIBS:=}" CPPFLAGS="$CPPFLAGS -DHAVE_CONFIG_H" dnl -------------------------------------- dnl Check whether to add /usr/local or not dnl (this is somewhat a religious problem) dnl -------------------------------------- dnl if test "`$CPP -v < /dev/null 2>&1 | grep '/usr/local/include' 2>&1`" = ""; then CPPFLAGS="$CPPFLAGS -I/usr/local/include" LDFLAGS="$LDFLAGS -L/usr/local/lib" fi dnl -------------------------------------- dnl If possible, enable dnl extensions to C or Posix on hosts dnl that normally disable the extensions, dnl typically due to standards-conformance dnl namespace issues. This should be dnl called before any macros that run the dnl C compiler. dnl -------------------------------------- AC_USE_SYSTEM_EXTENSIONS dnl -------------------------------------- dnl Process options dnl -------------------------------------- dnl AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging [default=no]], , enable_debug=no) AC_ARG_ENABLE(optimization, [ --enable-optimization turn on basic optimization [default=no]], , enable_optimization=no) AC_ARG_ENABLE(nls, [ --enable-nls turn on Natural Language Support [default=yes]], , enable_nls=yes) AC_ARG_ENABLE(gmp, [ --enable-gmp turn on use of GNU MP [default=yes]], , enable_gmp=yes) dnl -------------------------------------- dnl Checks for programs dnl -------------------------------------- dnl AC_PROG_CC AC_PROG_CC_C_O AC_PROG_CPP dnl AC_PROG_INSTALL AC_PATH_PROG(FIND,find) dnl * Debian uses ginstall-info instead of install-info dnl * to install info files. AC_PATH_PROGS(INSTINFO,install-info ginstall-info) dnl -------------------------------------- dnl Checks for header files dnl -------------------------------------- dnl AC_HEADER_STDC if test $ac_cv_header_stdc = yes; then AC_MSG_RESULT(Ok! I have just found them.) else AC_MSG_ERROR(Cannot find ANSI C header files!) fi AC_HEADER_STDBOOL AC_CHECK_HEADERS(fcntl.h locale.h stddef.h \ stdlib.h string.h sys/file.h time.h unistd.h wchar.h wctype.h) AC_HEADER_DIRENT AC_HEADER_STAT AC_HEADER_SYS_WAIT dnl -------------------------------------- dnl Checks for typedefs, structures, and dnl compiler characteristics dnl -------------------------------------- dnl dnl AC__GNU_SOURCE dnl AC_DEFINE([__EXTENSIONS__], 1, [Enable Solaris extensions.]) AC_SYS_LARGEFILE AC_C_CONST AC_C_INLINE AC_C_VARARRAYS AC_TYPE_SIZE_T AC_TYPE_PID_T AC_CHECK_TYPE(ptrdiff_t, int) AC_CHECK_TYPE(ssize_t, int) AC_STRUCT_ST_BLKSIZE AC_STRUCT_ST_RDEV AC_STRUCT_ST_MTIM_NSEC dnl AC_TYPE_MODE_T dnl AC_STRUCT_ST_BLOCKS dnl -------------------------------------- dnl Checks for libraries dnl -------------------------------------- if test "x$enable_gmp" = "xyes"; then AC_CHECK_LIB(gmp, __gmpz_init) fi dnl Required to make building under Cygwin possible if test "x$enable_nls" = "xyes"; then AC_CHECK_LIB(intl, setlocale) fi dnl -------------------------------------- dnl Checks for library functions dnl -------------------------------------- dnl dnl HAVE_SNPRINTF=0 dnl AC_CHECK_FUNC(snprintf, HAVE_SNPRINTF=1) dnl if test $HAVE_SNPRINTF = 0; then dnl AC_MSG_ERROR(Declaration of snprintf() not present!) dnl else dnl AC_MSG_RESULT(Ok! snprintf() is declared.) dnl fi HAVE_VSPRINTF=0 AC_CHECK_FUNC(vsprintf, HAVE_VSPRINTF=1) if test $HAVE_VSPRINTF = 0; then AC_MSG_ERROR(Declaration of vsprintf() not present!) else AC_MSG_RESULT(Ok! vsprintf() is declared.) fi HAVE_MEMSET=0 AC_CHECK_FUNC(memset, HAVE_MEMSET=1) if test $HAVE_MEMSET = 0; then AC_MSG_ERROR(Declaration of memset() not present!) else AC_MSG_RESULT(Ok! memset() is declared.) fi HAVE_MEMCHR=0 AC_CHECK_FUNC(memchr, HAVE_MEMCHR=1) if test $HAVE_MEMCHR = 0; then AC_MSG_ERROR(Declaration of memchr() not present!) else AC_MSG_RESULT(Ok! memchr() is declared.) fi HAVE_STRERROR=0 AC_CHECK_FUNC(strerror, HAVE_STRERROR=1) if test $HAVE_STRERROR = 0; then AC_MSG_ERROR(Declaration of strerror() not present!) else AC_MSG_RESULT(Ok! strerror() is declared.) fi HAVE_STRSPN=0 AC_CHECK_FUNC(strspn, HAVE_STRSPN=1) if test $HAVE_STRSPN = 0; then AC_MSG_ERROR(Declaration of strspn() not present!) else AC_MSG_RESULT(Ok! strspn() is declared.) fi HAVE_STRCSPN=0 AC_CHECK_FUNC(strcspn, HAVE_STRCSPN=1) if test $HAVE_STRCSPN = 0; then AC_MSG_ERROR(Declaration of strcspn() not present!) else AC_MSG_RESULT(Ok! strcspn() is declared.) fi AC_FUNC_STRERROR_R AC_FUNC_FORK AC_CHECK_FUNCS(localeconv gettimeofday isascii setlocale strchr strftime waitpid) # setmode DOS ? AC_FUNC_SETMODE_DOS # Check for clock_gettime and its library. Solaris puts it in -lrt or # -lposix4, but we don't want to link that library unless we have to. diff_saved_libs=$LIBS AC_SEARCH_LIBS(clock_gettime, [rt posix4]) case $ac_cv_search_clock_gettime in no | 'none required') LIB_CLOCK_GETTIME=;; *) LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime;; esac AC_SUBST([LIB_CLOCK_GETTIME]) AC_CHECK_FUNCS(clock_gettime) LIBS=$diff_saved_libs dnl -------------------------------------- dnl Check for functions declarations dnl -------------------------------------- dnl AC_DEFINE([USE_UNLOCKED_IO], [1], [Define to 1 if you want getc etc. to use unlocked I/O if available. Unlocked I/O can improve performance in unithreaded apps, but it is not safe for multithreaded apps.]) AC_CHECK_DECLS( [clearerr_unlocked, feof_unlocked, ferror_unlocked, fflush_unlocked, fgets_unlocked, fputc_unlocked, fputs_unlocked, fread_unlocked, fwrite_unlocked, getc_unlocked, getchar_unlocked, putc_unlocked, putchar_unlocked, strerror]) dnl -------------------------------------- dnl Optimization, debug, GNU MP and NLS dnl -------------------------------------- dnl if test "x$enable_gmp" = "xno"; then CPPFLAGS="$CPPFLAGS -DDISABLE_GMP " fi if test "x$enable_nls" = "xyes"; then CPPFLAGS="$CPPFLAGS -DENABLE_NLS " fi if test "x$enable_debug" = "xyes"; then CFLAGS="$CFLAGS $DBGFLAGS " fi if test "x$enable_optimization" = "xyes"; then CFLAGS="$CFLAGS $OPTFLAGS " fi dnl LIBS="$LIBS" dnl CPPFLAGS="$CPPFLAGS" dnl -------------------------------------- dnl Output the makefile dnl -------------------------------------- dnl AC_MSG_RESULT(Configuration terminated with success:) AC_MSG_RESULT(Preprocessor flags = "$CPPFLAGS") AC_MSG_RESULT(Compiler flags = "$CFLAGS") AC_MSG_RESULT(Linker flags = "$LDFLAGS") AC_MSG_RESULT(Libraries = "$LIBS") dnl Remember to include @SET_MAKE@ in Makefile.in !!! AC_PROG_MAKE_SET AC_OUTPUT(Makefile) dnl dnl -------------------------------------- dnl End of configure script. dnl -------------------------------------- numdiff-5.9.0/ndselect.c0000444000175000017500000004136613054341114014452 0ustar paologpaolog/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #ifdef ENABLE_NLS #include #endif #include"getopt.h" #include"linesplit.h" #include"numdiff.h" /* For NEWLINE and LINE_INTERR definitions */ #include"ndselect.h" #include"read_line.c" static int we_can_go_on (const char *field, unsigned long fieldno, unsigned long last_field) { if (!last_field) return (*field != '\0'); else return (fieldno <= last_field && *field != '\0'); } static void print_line (const char *line, const char **ifs, const char* osep, unsigned long first_field, unsigned long last_field, unsigned long increment, int omit_if_empty) { unsigned long fieldno, lf; int print_nl, at_least_one_field_printed; const char *field, *endfield, *nextfield, *stop, *ptr; if (!last_field) lf = 0; else { lf = (last_field - first_field) / increment; lf = lf * increment + first_field; } at_least_one_field_printed = 0; print_nl = strchr (line, NEWLINE) != NULL ? 1 : 0; field = string_spn (line, ifs, '\0'); for (fieldno = 1; (we_can_go_on (field, fieldno, last_field)) ; fieldno++) { endfield = string_cspn (field, ifs, '\0'); nextfield = string_spn (endfield, ifs, '\0'); if (fieldno >= first_field && (fieldno - first_field) % increment == 0) { if ((osep)) stop = endfield; else stop = (fieldno == lf || *nextfield == '\0') ? endfield : nextfield; for (ptr = field; ptr < stop; ptr++) fputc(*ptr, stdout); if ((osep)) { fputs (osep, stdout); } at_least_one_field_printed = 1; } field = nextfield; } if ((omit_if_empty)) { if ((print_nl) && (at_least_one_field_printed)) fputc(NEWLINE, stdout); } else { if ((print_nl)) fputc(NEWLINE, stdout); else fputc(' ', stdout); } } static int scan_file (char** def_ifs, const Argslist* data) { FILE *fp; char *line_buffer; char **ifs; unsigned long lineno; int errcode, omit_empty_lines; ifs = (!data->ifs) ? def_ifs : data->ifs; omit_empty_lines =(getBitAtPosition (&data->optmask, ___X_MASK) ==BIT_ON); if (!data->file || !*data->file) fp = stdin; else { if ( !(fp = fopen (data->file, "r")) ) return OPEN_ERROR; } if (!data->end_line) { for (lineno = 1; (line_buffer = read_line(fp, &errcode), errcode <= LINE_INTERR); lineno++) { if (lineno >= data->begin_line && (lineno - data->begin_line) % data->step == 0) print_line (line_buffer, (const char**) ifs, data->osep, data->first_field, data->last_field, data->increment, omit_empty_lines); free ((void*)line_buffer); } } else { for (lineno = 1; lineno <= data->end_line && (line_buffer = read_line(fp, &errcode), errcode <= LINE_INTERR); lineno++) { if (lineno >= data->begin_line && (lineno - data->begin_line) % data->step == 0) print_line (line_buffer, (const char**) ifs, data->osep, data->first_field, data->last_field, data->increment, omit_empty_lines); free ((void*)line_buffer); } } if (errcode <= EOF_REACHED) { if (fp == stdin) return OK; else return fclose (fp) == EOF ? CLOSE_ERROR : OK; } else { if((line_buffer)) free ((void*)line_buffer); if (fp != stdin) fclose (fp); return READ_ERROR; } } static void print_selversion (const char* progname) { printf ("%s %s\n", progname, VERSION); printf ("Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 %s \n", /* TRANSLATORS: This is a proper name. See the gettext manual, section Names. Pronounciation is like "evaa-no pree-me". */ _("Ivano Primi")); printf (_("\ License GPLv3+: GNU GPL version 3 or later,\n\ see .\n\ This is free software: you are free to change and redistribute it.\n\ There is NO WARRANTY, to the extent permitted by law.\n")); } static void print_selhelp (const char* progname) { puts (_("Usage:")); printf ("%s -h|--help|-v|--version %s\n\n", progname, _("or")); printf ("%s %s\n", progname, "[-b N][-e N][-s N][-F N][-L N][-I N][-S IFS][-D DELIMS][-O OSEP][-x][-l PATH][-o PATH] [FILE]"); /* %%% */ printf(_("\nPrint to standard output a subset of lines and fields from a given file.\n")); printf ("\n%s\n%s\n%s\n\n%s\n\n", _("The argument after the options is the name of the file to read from."), _("The complete path of the file should be given,\na directory name is not accepted."), _("If no input file is specified, the program reads from the standard input."), _("Exit status: 0 in case of normal termination, -1 (255) in case of error")); printf ("-b, --beginning, --start=N\n %s\n %s\n", _("Set to N the number of the first line to print"), _("(The default behavior is to start with line number 1)")); printf ("-e, --end=N\n %s\n %s\n", _("Set to N the number of the last line that can be printed"), _("(The default behavior is to arrive till to the end of the file)")); printf ("-s, --step=N\n %s\n %s\n", _("Set to N the increment to use when selecting the lines to print"), _("(The default value for the increment is 1)")); printf ("-F, --first-field=N\n %s\n %s\n", _("Set to N the number of the first field to print"), _("(The default behavior is to start with field number 1)")); printf ("-L, --last-field=N\n %s\n %s\n", _("Set to N the number of the last field that can be printed"), _("(The default behavior is to arrive till to the end of every line)")); printf ("-I, --increment=N\n %s\n %s\n", _("Set to N the increment to use when selecting the fields to print"), _("(The default value for the increment is 1)")); printf ("-S, --separators=IFS\n %s\n %s\n", _("Specify the set of characters to use as delimiters\n while splitting the input lines into fields"), _("(The default set of delimiters is space, tab and newline)")); printf ("-D, --delimiters=DELIMS\n %s\n %s\n", _("Specify the set of strings to use as delimiters\n while splitting the input lines into fields"), _("(The default set of delimiters is space, tab and newline)")); printf ("-O, --output-separator=OSEP\n %s\n %s\n", _("Specify the string to use as separator\n while writing the selected fields to the standard output"), _("(The default behavior consists in reusing\n the delimiters found in the input lines)")); printf ("-x, --omit-empty-lines\n %s\n", _("Do not print empty lines")); printf ("-l, --warnings-to=PATH\n %s\n", _("Redirect warning and error messages from stderr to the indicated file")); printf ("-o, --output=PATH\n %s\n", _("Redirect output from stdout to the indicated file")); printf ("-h, --help\n %s\n", _("Show this help message")); printf ("-v, --version\n %s\n\n", _("Show version number, Copyright, Distribution Terms and NO-Warranty")); } extern int errno; extern char *optarg; extern int optind; static int set_args (int argc, char* argv[], Argslist *list) { const char *optstring = "hb:e:s:F:L:I:S:D:O:xl:o:v"; struct option long_options[] = { {"help", 0, NULL, 'h'}, {"beginning", 1, NULL, 'b'}, {"start", 1, NULL, 'b'}, {"end", 1, NULL, 'e'}, {"step", 1, NULL, 's'}, {"first-field", 1, NULL, 'F'}, {"last-field", 1, NULL, 'L'}, {"increment", 1, NULL, 'I'}, {"separators", 1, NULL, 'S'}, {"delimiters", 1, NULL, 'D'}, {"output-separator", 1, NULL, 'O'}, {"omit-empty-lines", 0, NULL, 'x'}, {"warnings-to", 1, NULL, 'l'}, {"output", 1, NULL, 'o'}, {"version", 0, NULL, 'v'}, {0, 0, 0, 0} }; int option_index=0; char *endptr; int optch; /* We start by loading the default values for the user settable options. */ list->optmask = newBitVector (MAX_NDSELECT_OPTIONS); list->begin_line=1; list->end_line=0; list->step=1; list->first_field=1; list->last_field=0; list->increment=1; list->ifs = NULL; list->osep = NULL; list->file = NULL; while ( (optch = getopt_long (argc, argv, optstring, long_options, &option_index)) != -1 ) { switch (optch) { case 'h': setBitAtPosition (&list->optmask, ___H_MASK, BIT_ON); break; case 'b': setBitAtPosition (&list->optmask, ___B_MASK, BIT_ON); errno = 0; for (endptr = optarg; is_space (*endptr) != 0; endptr++); if (*endptr == '-' || (list->begin_line = strtoul (optarg, &endptr, 10), errno == ERANGE) || list->begin_line == 0 || *endptr != '\0') { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE2, optch); return -1; } break; case 'e': setBitAtPosition (&list->optmask, ___E_MASK, BIT_ON); errno = 0; for (endptr = optarg; is_space (*endptr) != 0; endptr++); if (*endptr == '-' || (list->end_line = strtoul (optarg, &endptr, 10), errno == ERANGE) || *endptr != '\0') { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE2, optch); return -1; } break; case 's': setBitAtPosition (&list->optmask, ___S_MASK, BIT_ON); errno = 0; for (endptr = optarg; is_space (*endptr) != 0; endptr++); if (*endptr == '-' || (list->step = strtoul (optarg, &endptr, 10), errno == ERANGE) || list->step == 0 || *endptr != '\0') { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE2, optch); return -1; } break; case 'F': setBitAtPosition (&list->optmask, ___SF_MASK, BIT_ON); errno = 0; for (endptr = optarg; is_space (*endptr) != 0; endptr++); if (*endptr == '-' || (list->first_field = strtoul (optarg, &endptr, 10), errno == ERANGE) || list->first_field == 0 || *endptr != '\0') { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE2, optch); return -1; } break; case 'L': setBitAtPosition (&list->optmask, ___SL_MASK, BIT_ON); errno = 0; for (endptr = optarg; is_space (*endptr) != 0; endptr++); if (*endptr == '-' || (list->last_field = strtoul (optarg, &endptr, 10), errno == ERANGE) || *endptr != '\0') { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE2, optch); return -1; } break; case 'I': setBitAtPosition (&list->optmask, ___SI_MASK, BIT_ON); errno = 0; for (endptr = optarg; is_space (*endptr) != 0; endptr++); if (*endptr == '-' || (list->increment = strtoul (optarg, &endptr, 10), errno == ERANGE) || list->increment == 0 || *endptr != '\0') { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE2, optch); return -1; } break; case 'S': if ((list->ifs)) { delete_string_vector (list->ifs); list->ifs = NULL; } list->ifs = ssplit_former_way (optarg); if (!list->ifs) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE2); return -1; } else if ( !is_string_in_vector(NEWLINE_STR, (const char**) list->ifs) ) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE2, optch); fprintf (stderr, _(" The list of field delimiters cannot be empty and\n must always include the newline character (\'\\n\')\n")); return -1; } else { remove_duplicates_from_string_vector (list->ifs); sort_string_vector (list->ifs); /* This is not strictly necessary */ setBitAtPosition (&list->optmask, ___SS_MASK, BIT_ON); } break; case 'D': if ((list->ifs)) { delete_string_vector (list->ifs); list->ifs = NULL; } list->ifs = ssplit (optarg, I_DEF_SEP); if (!list->ifs) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE2); return -1; } else if ( !is_string_in_vector(NEWLINE_STR, (const char**) list->ifs) ) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE2, optch); fprintf (stderr, _(" The list of field delimiters cannot be empty and\n must always include the newline string (\"\\n\")\n")); return -1; } else { remove_duplicates_from_string_vector (list->ifs); sort_string_vector (list->ifs); setBitAtPosition (&list->optmask, ___SD_MASK, BIT_ON); } break; case 'O': if ((list->osep)) { free((void*)list->osep); list->osep = NULL; } list->osep = get_separating_string (optarg); if (!list->osep) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE2); return -1; } else setBitAtPosition (&list->optmask, ___SO_MASK, BIT_ON); break; case 'x': setBitAtPosition (&list->optmask, ___X_MASK, BIT_ON); break; case 'l': if (!freopen (optarg, "w", stderr)) { fprintf (stderr, _("%s: cannot open file \"%s\":\n"), PACKAGE2, optarg); perror(0); return -1; } setBitAtPosition (&list->optmask, ___L_MASK, BIT_ON); break; case 'o': if (!freopen (optarg, "w", stdout)) { fprintf (stderr, _("%s: cannot open file \"%s\":\n"), PACKAGE2, optarg); perror(0); return -1; } setBitAtPosition (&list->optmask, ___O_MASK, BIT_ON); break; case 'v': setBitAtPosition (&list->optmask, ___V_MASK, BIT_ON); break; default: /* fprintf (stderr, */ /* _("%s: unrecognized option `-%c\' \n"), PACKAGE2, optch); */ return -1; } } if (getBitAtPosition (&list->optmask, ___H_MASK) == BIT_OFF && getBitAtPosition (&list->optmask, ___V_MASK) == BIT_OFF && argc - optind > 1) { print_selhelp (PACKAGE2); return -1; } else { if (getBitAtPosition (&list->optmask, ___H_MASK) == BIT_OFF && getBitAtPosition (&list->optmask, ___V_MASK) == BIT_OFF) list->file = (const char*) argv[optind]; return 0; } } static char** def_ifs = NULL; static void clean_up_memory (void) { delete_string_vector (def_ifs); } int main (int argc, char** argv) { Argslist arg_list; int pHelp, pVersion; def_ifs = ssplit (DEF_IFS, I_DEF_SEP); if ((atexit(clean_up_memory)) || !def_ifs) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE2); return -1; } #ifdef ENABLE_NLS setlocale (LC_CTYPE, ""); setlocale (LC_MESSAGES, ""); #endif bindtextdomain (PACKAGE2, LOCALEDIR); textdomain (PACKAGE2); if ( set_args (argc, argv, &arg_list) != 0 ) return -1; pHelp = getBitAtPosition (&arg_list.optmask, ___H_MASK) == BIT_ON; pVersion = getBitAtPosition (&arg_list.optmask, ___V_MASK) == BIT_ON; if ( (pHelp) || (pVersion) ) { if ((pVersion)) print_selversion(PACKAGE2); if ((pHelp)) print_selhelp(PACKAGE2); return (argc > 2 ? -1 : 0); } else { switch (scan_file (def_ifs, &arg_list)) { case OPEN_ERROR: fprintf (stderr, _("%s: cannot open file \"%s\":\n"), PACKAGE2, arg_list.file); perror(0); return -1; case CLOSE_ERROR: fprintf (stderr, _("%s: cannot close file \"%s\":\n"), PACKAGE2, arg_list.file); perror(0); return -1; case READ_ERROR: fprintf (stderr, _("%s: Error occurred while reading from file \"%s\"\n\n"), PACKAGE2, arg_list.file); return -1; default: return 0; } } } numdiff-5.9.0/exitfail.c0000644000175000017500000000217713054341114014455 0ustar paologpaolog/* Failure exit status Copyright (C) 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "system.h" #include "exitfail.h" #include /* Modified by Ivano Primi on April 18, 2009. The value of the constant EXIT_FAILURE (1) is used by Numdiff to mean that the given files are different. To signal troubles Numdiff uses EXIT_TROUBLE (-1). */ int volatile exit_failure = EXIT_TROUBLE; numdiff-5.9.0/arith.c0000444000175000017500000003150113054341114013746 0ustar paologpaolog/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include"numdiff.h" #ifdef USE_GMP #include Real Zero, Ten, Inf; void init_mpa(int iscale) { char tmpbuff[1024]; /* Hopefully the highest possible number of digits for a LONG will never become larger than 1000!! :) */ sprintf (tmpbuff, "1e%ld", LONG_MAX); mpf_set_default_prec ((iscale * 32) / 10); mpf_init (Zero); mpf_init_set_ui (Ten, 10); mpf_init_set_str (Inf, tmpbuff, 10); } void initR (Real* px) { mpf_init (*px); } void initC (Complex* pz) { mpf_init (pz->re); mpf_init (pz->im); } void copyR (Real* dst, Real src) { mpf_set (*dst, src); } void copyC (Complex* dst, Complex src) { mpf_set (dst->re, src.re); mpf_set (dst->im, src.im); } void str2R (const char *q, char **endptr, int iscale, const struct numfmt* pnf, Real* pr) { mpf_a2num (pr, q, endptr, pnf); } void str2C (const char *q, char **endptr, int iscale, const struct numfmt* pnf, Complex* pc) { char *ptr, *ptr2; mpf_init (pc->re); mpf_init (pc->im); mpf_a2num (&pc->re, q, &ptr, pnf); if ((endptr)) *endptr = ptr; if (ptr != q) { if (*ptr == pnf->iu) { mpf_set (pc->im, pc->re); mpf_set (pc->re, Zero); if ((endptr)) *endptr = ptr + 1; } else { while (is_space (*ptr)) ptr++; if (*ptr == POS_SIGN || *ptr == NEG_SIGN) { mpf_a2num (&pc->im, ptr, &ptr2, pnf); if (*ptr2 != pnf->iu) mpf_set (pc->im, Zero); else { if ((endptr)) *endptr = ptr2 + 1; } } /* else : we have successfully read a real number but there is no another number after it. : So, we leave pc->im set to zero. */ } } else /* : q does not contain any valid number ==> pc->re is 0. Then we set pc->im to 0. We remark that, if endptr is not NULL, then *endptr == q. */ mpf_set (pc->im, Zero); } void add (Real s, Real t, Real* q, int iscale) { mpf_add (*q, s, t); } void square (Real s, Real* q, int iscale) { mpf_pow_ui (*q, s, 2); } void divide (Real s, Real t, Real* q, int iscale) { mpf_div (*q, s, t); } void divide_by_int (Real* q, int d, int iscale) { Real div; if (d == 0) mpf_set (*q, Zero); else { mpf_init_set_si (div, d); mpf_div (*q, *q, div); mpf_clear (div); } } void square_root (Real* q, int iscale) { mpf_sqrt (*q, *q); } void Cabs (Complex z, Real* pm, int iscale) { mpf_t a, b, q; if ( mpf_sgn (z.re) >= 0 ) mpf_init_set (a, z.re); else { mpf_init (a); mpf_sub (a, Zero, z.re); } if ( (mpf_sgn(z.im) == 0) ) { mpf_set (*pm, a); mpf_clear (a); return; } else if ( (mpf_sgn(z.im) > 0) ) mpf_init_set (b, z.im); else { mpf_init (b); mpf_sub (b, Zero, z.im); } mpf_init (q); if ( mpf_cmp (b, a) > 0 ) { mpf_div (q, a, b); mpf_mul (a, q, q); mpf_add_ui (q, a, 1); mpf_sqrt (q, q); mpf_mul (*pm, b, q); } else { /* a >= b ===> a > 0 */ mpf_div (q, b, a); mpf_mul (b, q, q); mpf_add_ui (q, b, 1); mpf_sqrt (q, q); mpf_mul (*pm, a, q); } mpf_clear (q); mpf_clear (b); mpf_clear (a); } void Csub (Complex z1, Complex z2, Complex* pw, int iscale) { mpf_sub (pw->re, z1.re, z2.re); mpf_sub (pw->im, z1.im, z2.im); } int cmp (Real p, Real q) { return mpf_cmp (p, q); } int is0 (Real u) { return (mpf_cmp (u, Zero) == 0 ? 1 : 0); } int smart_cmp (const Complex* pz1, const Complex* pz2, int flag) { if (flag == 0) return 1; else if (flag > 0) return (mpf_cmp (pz1->re, pz2->re) >= 0 && mpf_cmp (pz1->im, pz2->im) >= 0); else /* flag < 0 */ return (mpf_cmp (pz1->re, pz2->re) <= 0 && mpf_cmp (pz1->im, pz2->im) <= 0); } static int round_far_from_zero (char* mantissa, int prec) { size_t length; char *ptr, *abs_mantissa; /* abs_mantissa is a pointer to the absolute value of MANTISSA. If MANTISSA starts with a minus sign, then abs_mantissa has to point to the digit immediately after this sign. */ if (*mantissa == NEG_SIGN) abs_mantissa = mantissa + 1; else abs_mantissa = mantissa; length = strlen (abs_mantissa); /* If the length of the string ABS_MANTISSA is less or equal than PREC+1, then no rounding is required and zero has to be returned. */ if (length <= prec + 1) return 0; else { /* If length > prec + 1, then the character of ABS_MANTISSA in the position PREC+1 is non-null. If this character is a number between 0 and 4, then the rounding procedure ends hier. */ ptr = abs_mantissa + (prec + 1); if ((*ptr - CHAR_ZERO) >= 5) { /* Otherwise we have to "increment" the previous character by 1, taking into account each time the amount to be carried. */ for (ptr--; ptr > abs_mantissa && *ptr == CHAR_NINE; *ptr = CHAR_ZERO, ptr--); if (ptr == abs_mantissa) { /* If the first PREC+1 digits of ABS_MANTISSA were all equal to 9, then the rounding procedure has to set all of them to zero and return 1, i.e. the last carried amount. */ if (*ptr == CHAR_NINE) { *ptr = CHAR_ZERO; return 1; } /* If the first digit of ABS_MANTISSA is less than 9, then the rounding procedure ends by incrementing this digit by 1 and returning 0. */ else *ptr = *ptr + 1; } /* If at least one of the first PREC+1 digits of ABS_MANTISSA is less than 9, then the rounding procedure ends by incrementing this digit by 1 and returning 0. */ else *ptr = *ptr + 1; } return 0; } /* LENGTH > PREC + 1 */ } static void fprintno (FILE *fp, Real u, int prec) { if (mpf_cmp (u, Inf) == 0) printf ("Inf"); else { char *ptr, *mantissa; mp_exp_t expn; ptr = mantissa = mpf_get_str (NULL, &expn, 10, 0, u); if (*mantissa == '\0') { /* If MANTISSA is the empty string, then print 0 with the required number of decimal digits. */ fputc (CHAR_ZERO, fp); fputc (DP, fp); for (; prec > 0; prec--) fputc (CHAR_ZERO, fp); fputc (ECH, fp); fputc (POS_SIGN, fp); fputc (CHAR_ZERO, fp); } else { int amount_to_carry = round_far_from_zero (mantissa, prec); if (*ptr == NEG_SIGN) { /* Print a minus sign if the number is negative */ fputc (NEG_SIGN, fp); ptr++; } /* The mantissa has been already rounded to the given precision PREC. If MANTISSA before the rounding was "99...9", then now it is given by "00...0" but there is a leading 1 which has to be carried. */ if (amount_to_carry) { fputc (CHAR_ONE, fp); expn++; } else { fputc (*ptr, fp); ptr++; } /* We print now the decimal point */ fputc (DP, fp); /* and the remaining digits of the mantissa. After the decimal point has been printed, one must print no more than PREC digits. */ for (; *ptr != '\0' && prec > 0; ptr++, prec--) fputc (*ptr, fp); /* If the remaining digits of the mantissa are less than PREC, then fill up with zeros. */ if (*ptr == '\0') { for (; prec > 0; prec--) fputc (CHAR_ZERO, fp); } /* Finally we print the exponent with its sign */ fprintf (fp, "%c%+ld", ECH, expn - 1); } free ((void*) mantissa); } /* u != Inf */ } void printno (Real u, int m) { fprintno (stdout, u, m); } #ifdef _MPA_DEBUG void debug_printno (Real u, int m) { fprintno (stderr, u, m); } #endif void delR (Real* px) { mpf_clear (*px); } void delC (Complex* pz) { mpf_clear (pz->re); mpf_clear (pz->im); } void end_mpa(void) { mpf_clear (Inf); mpf_clear (Ten); mpf_clear (Zero); } #else /* not USE_GMP */ #include"number.c" #include"errors.c" #include"new.c" Real Zero, Inf; void init_mpa(int iscale) { bc_init_numbers(); bc_init_num(&Zero); Inf = bc_new_num (1,0); Inf->n_value[0] = 10; } void initR (Real* px) { bc_init_num (px); } void initC (Complex* pz) { bc_init_num (&pz->re); bc_init_num (&pz->im); } void copyR (Real* dst, Real src) { *dst = bc_copy_num (src); } void copyC (Complex* dst, Complex src) { dst->re = bc_copy_num (src.re); dst->im = bc_copy_num (src.im); } void str2R (const char *q, char **endptr, int iscale, const struct numfmt* pnf, Real* pr) { bc_a2num (pr, q, endptr, iscale, pnf); } void str2C (const char *q, char **endptr, int iscale, const struct numfmt* pnf, Complex* pc) { char *ptr, *ptr2; bc_init_num (&pc->re); bc_init_num (&pc->im); bc_a2num (&pc->re, q, &ptr, iscale, pnf); if ((endptr)) *endptr = ptr; if (ptr != q) { if (*ptr == pnf->iu) { pc->im = bc_copy_num (pc->re); pc->re = bc_copy_num (_zero_); if ((endptr)) *endptr = ptr + 1; } else { while (is_space (*ptr)) ptr++; if (*ptr == POS_SIGN || *ptr == NEG_SIGN) { bc_a2num (&pc->im, ptr, &ptr2, iscale, pnf); if (*ptr2 != pnf->iu) pc->im = bc_copy_num (_zero_); else { if ((endptr)) *endptr = ptr2 + 1; } } /* else : we have successfully read a real number but there is no another number after it. : So, we leave pc->im set to zero. */ } } else /* : q does not contain any valid number ==> pc->re is 0. Then we set pc->im to 0. We remark that, if endptr is not NULL, then *endptr == q. */ pc->im = bc_copy_num (_zero_); } void add (Real s, Real t, Real* q, int iscale) { bc_add (s, t, q, iscale); } void square (Real s, Real* q, int iscale) { bc_multiply (s, s, q, iscale); } void divide (Real s, Real t, Real* q, int iscale) { bc_divide (s, t, q, iscale); } void divide_by_int (Real* q, int d, int iscale) { Real num, div; if (d == 0) { bc_free_num (q); bc_init_num (q); } else { bc_init_num (&div); bc_int2num (&div, d); num = bc_copy_num (*q); bc_divide (num, div, q, iscale); bc_free_num (&num); bc_free_num (&div); } } void square_root (Real* q, int iscale) { bc_sqrt (q, iscale); } void Cabs (Complex z, Real* pm, int iscale) { bc_num a, b, q; if ( z.re->n_sign == PLUS ) a = bc_copy_num (z.re); else { bc_init_num (&a); bc_sub (Zero, z.re, &a, iscale); } if ( (bc_is_zero(z.im)) ) { *pm = a; return; } else if ( z.im->n_sign == PLUS ) b = bc_copy_num (z.im); else { bc_init_num (&b); bc_sub (Zero, z.im, &b, iscale); } bc_init_num (&q); if ( bc_compare (b, a) > 0 ) { bc_divide (a, b, &q, iscale); bc_multiply (q, q, &a, iscale); bc_add (a, _one_, &q, iscale); bc_sqrt (&q, iscale); bc_multiply (b, q, pm, iscale); } else { /* a >= b ===> a > 0 */ bc_divide (b, a, &q, iscale); bc_multiply (q, q, &b, iscale); bc_add (b, _one_, &q, iscale); bc_sqrt (&q, iscale); bc_multiply (a, q, pm, iscale); } bc_free_num (&q); bc_free_num (&b); bc_free_num (&a); } void Csub (Complex z1, Complex z2, Complex* pw, int iscale) { bc_sub (z1.re, z2.re, &pw->re, iscale); bc_sub (z1.im, z2.im, &pw->im, iscale); } int cmp (Real p, Real q) { return bc_compare (p, q); } int is0 (Real u) { return bc_is_zero (u); } int smart_cmp (const Complex* pz1, const Complex* pz2, int flag) { if (flag == 0) return 1; else if (flag > 0) return (bc_compare (pz1->re, pz2->re) >= 0 && bc_compare (pz1->im, pz2->im) >= 0); else /* flag < 0 */ return (bc_compare (pz1->re, pz2->re) <= 0 && bc_compare (pz1->im, pz2->im) <= 0); } void printno (Real u, int m) { bc_print_num (u, out_char, m); } #ifdef _MPA_DEBUG void debug_printno (Real u, int m) { bc_print_num (u, out_char_stderr, m); } #endif void delR (Real* px) { bc_free_num (px); } void delC (Complex* pz) { bc_free_num (&pz->re); bc_free_num (&pz->im); } void end_mpa(void) { bc_free_num (&Inf); bc_free_num (&Zero); bc_end(); } #endif /* not USE_GMP */ numdiff-5.9.0/getopt.c0000644000175000017500000010123713054341114014147 0ustar paologpaolog/* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to drepper@gnu.org before changing it! Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001,2002,2003,2004 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ #ifndef _NO_PROTO # define _NO_PROTO #endif #ifdef HAVE_CONFIG_H # include #endif #include /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ # include # include #endif /* GNU C library. */ #include #ifdef VMS # include #endif #ifdef _LIBC # include #else # include "gettext.h" # define _(msgid) gettext (msgid) #endif #if defined _LIBC && defined USE_IN_LIBIO # include #endif #ifndef attribute_hidden # define attribute_hidden #endif /* Unlike standard Unix `getopt', functions like `getopt_long' let the user intersperse the options with the other arguments. As `getopt_long' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Using `getopt' or setting the environment variable POSIXLY_CORRECT disables permutation. Then the application's behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt.h" #include "getopt_int.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* 1003.2 says this must be 1 before any call. */ int optind = 1; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Keep a global copy of all internal members of getopt_data. */ static struct _getopt_data getopt_data; #ifndef __GNU_LIBRARY__ /* Avoid depending on library functions or files whose names are inconsistent. */ #ifndef getenv extern char *getenv (); #endif #endif /* not __GNU_LIBRARY__ */ #ifdef _LIBC /* Stored original parameters. XXX This is no good solution. We should rather copy the args so that we can compare them later. But we must not use malloc(3). */ extern int __libc_argc; extern char **__libc_argv; /* Bash 2.0 gives us an environment variable containing flags indicating ARGV elements that should not be considered arguments. */ # ifdef USE_NONOPTION_FLAGS /* Defined in getopt_init.c */ extern char *__getopt_nonoption_flags; # endif # ifdef USE_NONOPTION_FLAGS # define SWAP_FLAGS(ch1, ch2) \ if (d->__nonoption_flags_len > 0) \ { \ char __tmp = __getopt_nonoption_flags[ch1]; \ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ __getopt_nonoption_flags[ch2] = __tmp; \ } # else # define SWAP_FLAGS(ch1, ch2) # endif #else /* !_LIBC */ # define SWAP_FLAGS(ch1, ch2) #endif /* _LIBC */ /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ static void exchange (char **argv, struct _getopt_data *d) { int bottom = d->__first_nonopt; int middle = d->__last_nonopt; int top = d->optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ #if defined _LIBC && defined USE_NONOPTION_FLAGS /* First make sure the handling of the `__getopt_nonoption_flags' string can work normally. Our top argument must be in the range of the string. */ if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len) { /* We must extend the array. The user plays games with us and presents new arguments. */ char *new_str = malloc (top + 1); if (new_str == NULL) d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0; else { memset (__mempcpy (new_str, __getopt_nonoption_flags, d->__nonoption_flags_max_len), '\0', top + 1 - d->__nonoption_flags_max_len); d->__nonoption_flags_max_len = top + 1; __getopt_nonoption_flags = new_str; } } #endif while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; SWAP_FLAGS (bottom + i, middle + i); } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ d->__first_nonopt += (d->optind - d->__last_nonopt); d->__last_nonopt = d->optind; } /* Initialize the internal data when the first call is made. */ static const char * _getopt_initialize (int argc, char **argv, const char *optstring, int posixly_correct, struct _getopt_data *d) { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ d->__first_nonopt = d->__last_nonopt = d->optind; d->__nextchar = NULL; d->__posixly_correct = posixly_correct || !!getenv ("POSIXLY_CORRECT"); /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { d->__ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { d->__ordering = REQUIRE_ORDER; ++optstring; } else if (d->__posixly_correct) d->__ordering = REQUIRE_ORDER; else d->__ordering = PERMUTE; #if defined _LIBC && defined USE_NONOPTION_FLAGS if (!d->__posixly_correct && argc == __libc_argc && argv == __libc_argv) { if (d->__nonoption_flags_max_len == 0) { if (__getopt_nonoption_flags == NULL || __getopt_nonoption_flags[0] == '\0') d->__nonoption_flags_max_len = -1; else { const char *orig_str = __getopt_nonoption_flags; int len = d->__nonoption_flags_max_len = strlen (orig_str); if (d->__nonoption_flags_max_len < argc) d->__nonoption_flags_max_len = argc; __getopt_nonoption_flags = (char *) malloc (d->__nonoption_flags_max_len); if (__getopt_nonoption_flags == NULL) d->__nonoption_flags_max_len = -1; else memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), '\0', d->__nonoption_flags_max_len - len); } } d->__nonoption_flags_len = d->__nonoption_flags_max_len; } else d->__nonoption_flags_len = 0; #endif return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns -1. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. If POSIXLY_CORRECT is nonzero, behave as if the POSIXLY_CORRECT environment variable were set. */ int _getopt_internal_r (int argc, char **argv, const char *optstring, const struct option *longopts, int *longind, int long_only, int posixly_correct, struct _getopt_data *d) { int print_errors = d->opterr; if (optstring[0] == ':') print_errors = 0; if (argc < 1) return -1; d->optarg = NULL; if (d->optind == 0 || !d->__initialized) { if (d->optind == 0) d->optind = 1; /* Don't scan ARGV[0], the program name. */ optstring = _getopt_initialize (argc, argv, optstring, posixly_correct, d); d->__initialized = 1; } /* Test whether ARGV[optind] points to a non-option argument. Either it does not have option syntax, or there is an environment flag from the shell indicating it is not an option. The later information is only used when the used in the GNU libc. */ #if defined _LIBC && defined USE_NONOPTION_FLAGS # define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \ || (d->optind < d->__nonoption_flags_len \ && __getopt_nonoption_flags[d->optind] == '1')) #else # define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0') #endif if (d->__nextchar == NULL || *d->__nextchar == '\0') { /* Advance to the next ARGV-element. */ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been moved back by the user (who may also have changed the arguments). */ if (d->__last_nonopt > d->optind) d->__last_nonopt = d->optind; if (d->__first_nonopt > d->optind) d->__first_nonopt = d->optind; if (d->__ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind) exchange ((char **) argv, d); else if (d->__last_nonopt != d->optind) d->__first_nonopt = d->optind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (d->optind < argc && NONOPTION_P) d->optind++; d->__last_nonopt = d->optind; } /* The special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (d->optind != argc && !strcmp (argv[d->optind], "--")) { d->optind++; if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind) exchange ((char **) argv, d); else if (d->__first_nonopt == d->__last_nonopt) d->__first_nonopt = d->optind; d->__last_nonopt = argc; d->optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (d->optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (d->__first_nonopt != d->__last_nonopt) d->optind = d->__first_nonopt; return -1; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if (NONOPTION_P) { if (d->__ordering == REQUIRE_ORDER) return -1; d->optarg = argv[d->optind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ d->__nextchar = (argv[d->optind] + 1 + (longopts != NULL && argv[d->optind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (longopts != NULL && (argv[d->optind][1] == '-' || (long_only && (argv[d->optind][2] || !strchr (optstring, argv[d->optind][1]))))) { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = -1; int option_index; for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) { if ((unsigned int) (nameend - d->__nextchar) == (unsigned int) strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"), argv[0], argv[d->optind]) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("%s: option `%s' is ambiguous\n"), argv[0], argv[d->optind]); #endif } d->__nextchar += strlen (d->__nextchar); d->optind++; d->optopt = 0; return '?'; } if (pfound != NULL) { option_index = indfound; d->optind++; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) d->optarg = nameend + 1; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; int n; #endif if (argv[d->optind - 1][1] == '-') { /* --option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("\ %s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); #else fprintf (stderr, _("\ %s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); #endif } else { /* +option or -option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("\ %s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[d->optind - 1][0], pfound->name); #else fprintf (stderr, _("\ %s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[d->optind - 1][0], pfound->name); #endif } #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #endif } d->__nextchar += strlen (d->__nextchar); d->optopt = pfound->val; return '?'; } } else if (pfound->has_arg == 1) { if (d->optind < argc) d->optarg = argv[d->optind++]; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option `%s' requires an argument\n"), argv[0], argv[d->optind - 1]) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[d->optind - 1]); #endif } d->__nextchar += strlen (d->__nextchar); d->optopt = pfound->val; return optstring[0] == ':' ? ':' : '?'; } } d->__nextchar += strlen (d->__nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[d->optind][1] == '-' || strchr (optstring, *d->__nextchar) == NULL) { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; int n; #endif if (argv[d->optind][1] == '-') { /* --option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: unrecognized option `--%s'\n"), argv[0], d->__nextchar); #else fprintf (stderr, _("%s: unrecognized option `--%s'\n"), argv[0], d->__nextchar); #endif } else { /* +option or -option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"), argv[0], argv[d->optind][0], d->__nextchar); #else fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), argv[0], argv[d->optind][0], d->__nextchar); #endif } #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #endif } d->__nextchar = (char *) ""; d->optind++; d->optopt = 0; return '?'; } } /* Look at and handle the next short option-character. */ { char c = *d->__nextchar++; char *temp = strchr (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*d->__nextchar == '\0') ++d->optind; if (temp == NULL || c == ':') { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; int n; #endif if (d->__posixly_correct) { /* 1003.2 specifies the format of this message. */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: illegal option -- %c\n"), argv[0], c); #else fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); #endif } else { #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: invalid option -- %c\n"), argv[0], c); #else fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); #endif } #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #endif } d->optopt = c; return '?'; } /* Convenience. Treat POSIX -W foo same as long option --foo */ if (temp[0] == 'W' && temp[1] == ';') { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; int option_index; /* This is an option that requires an argument. */ if (*d->__nextchar != '\0') { d->optarg = d->__nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ d->optind++; } else if (d->optind == argc) { if (print_errors) { /* 1003.2 specifies the format of this message. */ #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("%s: option requires an argument -- %c\n"), argv[0], c) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); #endif } d->optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; return c; } else /* We already incremented `d->optind' once; increment it again when taking next ARGV-elt as argument. */ d->optarg = argv[d->optind++]; /* optarg is now the argument, see if it's in the table of longopts. */ for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) { if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[d->optind]) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[d->optind]); #endif } d->__nextchar += strlen (d->__nextchar); d->optind++; return '?'; } if (pfound != NULL) { option_index = indfound; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) d->optarg = nameend + 1; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name); #endif } d->__nextchar += strlen (d->__nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (d->optind < argc) d->optarg = argv[d->optind++]; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option `%s' requires an argument\n"), argv[0], argv[d->optind - 1]) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[d->optind - 1]); #endif } d->__nextchar += strlen (d->__nextchar); return optstring[0] == ':' ? ':' : '?'; } } d->__nextchar += strlen (d->__nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } d->__nextchar = NULL; return 'W'; /* Let the application handle it. */ } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*d->__nextchar != '\0') { d->optarg = d->__nextchar; d->optind++; } else d->optarg = NULL; d->__nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*d->__nextchar != '\0') { d->optarg = d->__nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ d->optind++; } else if (d->optind == argc) { if (print_errors) { /* 1003.2 specifies the format of this message. */ #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option requires an argument -- %c\n"), argv[0], c) >= 0) { _IO_flockfile (stderr); int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); free (buf); } #else fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); #endif } d->optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ d->optarg = argv[d->optind++]; d->__nextchar = NULL; } } return c; } } int _getopt_internal (int argc, char **argv, const char *optstring, const struct option *longopts, int *longind, int long_only, int posixly_correct) { int result; getopt_data.optind = optind; getopt_data.opterr = opterr; result = _getopt_internal_r (argc, argv, optstring, longopts, longind, long_only, posixly_correct, &getopt_data); optind = getopt_data.optind; optarg = getopt_data.optarg; optopt = getopt_data.optopt; return result; } /* glibc gets a LSB-compliant getopt. Standalone applications get a POSIX-compliant getopt. */ #if _LIBC enum { POSIXLY_CORRECT = 0 }; #else enum { POSIXLY_CORRECT = 1 }; #endif int getopt (int argc, char *const *argv, const char *optstring) { return _getopt_internal (argc, (char **) argv, optstring, NULL, NULL, 0, POSIXLY_CORRECT); } #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (int argc, char **argv) { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == -1) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ numdiff-5.9.0/main.c0000444000175000017500000004233513054341114013572 0ustar paologpaolog/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Leave this inclusion at the begin, otherwise problems */ /* with the symbol __USE_FILE_OFFSET64 */ #include"numdiff.h" #include"linesplit.h" #include #include /* for free() */ #include #if HAVE_GETTIMEOFDAY #include #endif #ifdef ENABLE_NLS #include #endif /* See cmpfns.c */ extern int cmp_files (FILE* pf1, FILE* pf2, const argslist* argl, statlist* statres); /* See options.c */ extern void print_version (const char* progname); extern void print_help (const char* progname); extern int setargs (int argc, char* argv[], argslist *list); static void load_defaults (argslist * list, statlist* statres) { int i; binary = 0; suppress_common_lines = 0; ignore_white_space = IGNORE_NO_WHITE_SPACE; expand_tabs = 0; speed_large_files = 0; program_name = PACKAGE; list->optmask = newBitVector (MAX_NUMDIFF_OPTIONS); list->output_mode = OUTMODE_NORMAL; for (i=0; i < FIELDMASK_SIZE; i++) { list->ghostmask1[i] = list->ghostmask2[i] = 0x0; list->tblurmask1[i] = list->tblurmask2[i] = 0x0; list->pblurmask1[i] = list->pblurmask2[i] = 0x0; } list->relerr_formula = CLASSIC_FORMULA; statres->Labserr_location.lineno1 = statres->Labserr_location.fieldno1 = 0; statres->Labserr_location.lineno2 = statres->Labserr_location.fieldno2 = 0; statres->Rabserr_location.lineno1 = statres->Rabserr_location.fieldno1 = 0; statres->Rabserr_location.lineno2 = statres->Rabserr_location.fieldno2 = 0; statres->Nentries = statres->Ndisperr = 0; list->flag = 0; list->ifs1 = list->ifs2 = NULL; list->iscale = ISCALE; list->nf1.dp = DP; list->nf1.thsep = THSEP; list->nf1.grouping = GROUPING; list->nf1.pos_sign = POS_SIGN; list->nf1.neg_sign = NEG_SIGN; list->nf1.ech = ECH; list->nf1.iu = IU; list->file1 = list->file2 = NULL; list->nf2 = list->nf1; list->nf1.currency = get_separating_string (CURRENCY); list->nf2.currency = get_separating_string (CURRENCY); } static void init_mpa_support (argslist* list, statlist* statres) { init_mpa(list->iscale); initR (&statres->Labserr); initR (&statres->Crelerr); initR (&statres->Lrelerr); initR (&statres->Cabserr); initR (&statres->N1abserr); initR (&statres->N1disperr); initR (&statres->N2abserr); initR (&statres->N2disperr); list->maxabserr = thrlist_new (); list->maxrelerr = thrlist_new (); } static void dismiss_mpa_support (argslist* list, statlist* statres) { delR (&statres->Labserr); delR (&statres->Crelerr); delR (&statres->Lrelerr); delR (&statres->Cabserr); delR (&statres->N1abserr); delR (&statres->N1disperr); delR (&statres->N2abserr); delR (&statres->N2disperr); thrlist_dispose (&list->maxabserr); thrlist_dispose (&list->maxrelerr); end_mpa(); } static void set_mtime_to_now (struct stat *st) { #ifdef ST_MTIM_NSEC # if HAVE_CLOCK_GETTIME && defined CLOCK_REALTIME if (clock_gettime (CLOCK_REALTIME, &st->st_mtim) == 0) return; # endif # if HAVE_GETTIMEOFDAY { struct timeval timeval; if (gettimeofday (&timeval, NULL) == 0) { st->st_mtime = timeval.tv_sec; st->st_mtim.ST_MTIM_NSEC = timeval.tv_usec * 1000; return; } } # endif #endif /* ST_MTIM_NSEC */ time (&st->st_mtime); } /* cmp.file[f].desc markers */ #define NONEXISTENT (-1) /* nonexistent file */ #define UNOPENED (-2) /* unopened file (e.g. directory) */ #define ERRNO_ENCODE(errno) (-3 - (errno)) /* encoded errno value */ #define ERRNO_DECODE(desc) (-3 - (desc)) /* inverse of ERRNO_ENCODE */ #define DIR_P(f) (S_ISDIR (files[f].stat.st_mode) != 0) static int open_files (const char* name0, const char* name1) { register int f; int status = EXIT_SUCCESS; bool same_files; if (!name0 || !name1) return EXIT_TROUBLE; memset (files, 0, sizeof files); files[0].desc = UNOPENED; files[1].desc = UNOPENED; files[0].name = name0; files[1].name = name1; /* Stat the files. */ for (f = 0; f < 2; f++) { if ((f) && file_name_cmp (files[f].name, files[0].name) == 0) { files[f].desc = files[0].desc; files[f].stat = files[0].stat; } else if (strcmp (files[f].name, "-") == 0) { files[f].desc = STDIN_FILENO; if (fstat (STDIN_FILENO, &files[f].stat) != 0) files[f].desc = ERRNO_ENCODE (errno); else { if (S_ISREG (files[f].stat.st_mode)) { off_t pos = lseek (STDIN_FILENO, (off_t) 0, SEEK_CUR); if (pos < 0) files[f].desc = ERRNO_ENCODE (errno); else files[f].stat.st_size = MAX (0, files[f].stat.st_size - pos); } /* POSIX 1003.1-2001 requires current time for stdin. */ set_mtime_to_now (&files[f].stat); } } else if (stat (files[f].name, &files[f].stat) != 0) files[f].desc = ERRNO_ENCODE (errno); } for (f = 0; f < 2; f++) { int e = ERRNO_DECODE (files[f].desc); if (0 <= e) { errno = e; perror_with_name (files[f].name); status = EXIT_TROUBLE; } } if (status != EXIT_SUCCESS) /* One of the files should exist but does not. */ return status; else if (DIR_P (0) | DIR_P (1)) return EXIT_TROUBLE; else { /* Both exist and neither is a directory. */ /* Are they the same file ? */ same_files = (files[0].desc != NONEXISTENT && files[1].desc != NONEXISTENT && 0 < same_file (&files[0].stat, &files[1].stat) && same_file_attributes (&files[0].stat, &files[1].stat)); /* Open the files and record their descriptors. */ if (files[0].desc == UNOPENED) if ((files[0].desc = open (files[0].name, O_RDONLY, 0)) < 0) { perror_with_name (files[0].name); status = EXIT_TROUBLE; } if (files[1].desc == UNOPENED) { if ((same_files)) files[1].desc = files[0].desc; else if ((files[1].desc = open (files[1].name, O_RDONLY, 0)) < 0) { perror_with_name (files[1].name); status = EXIT_TROUBLE; } } #if HAVE_SETMODE_DOS if (binary) for (f = 0; f < 2; f++) if (0 <= files[f].desc) set_binary_mode (files[f].desc, 1); #endif return status; } } static int compare_files (const argslist* list, int* is_same_physical_file) { if ((files[0].desc != NONEXISTENT && files[1].desc != NONEXISTENT && 0 < same_file (&files[0].stat, &files[1].stat) && same_file_attributes (&files[0].stat, &files[1].stat))) { /* The two named files are actually the same physical file. We know they are identical without actually reading them. */ *is_same_physical_file = 1; return 0; } else { int status = diff_2_files (files, list); /* STATUS is 0 if no changes have been found, 1 in case of detected changes, -1 if either file is binary. */ *is_same_physical_file = 0; return status; } } static int rewind_files (void) { off_t pos0, pos1; int status = EXIT_SUCCESS; if ((pos0 = lseek(files[0].desc, (off_t) 0, SEEK_SET)) < 0) { perror_with_name (files[0].name); status = EXIT_TROUBLE; } if ((pos1 = lseek(files[1].desc, (off_t) 0, SEEK_SET)) < 0) { perror_with_name (files[1].name); status = EXIT_TROUBLE; } return status; } static int set_file_pointers (FILE** fpp1, FILE** fpp2) { int status = EXIT_SUCCESS; if ( !(*fpp1 = fdopen (files[0].desc, "r")) ) { perror_with_name (files[0].name); status = EXIT_TROUBLE; } if ( !(*fpp2 = fdopen (files[1].desc, "r")) ) { perror_with_name (files[1].name); status = EXIT_TROUBLE; } return status; } static int close_files (void) { /* Close the file descriptors. */ if (0 <= files[0].desc && close (files[0].desc) != 0) { perror_with_name (files[0].name); return EXIT_TROUBLE; } if (0 <= files[1].desc && files[0].desc != files[1].desc && close (files[1].desc) != 0) { perror_with_name (files[1].name); return EXIT_TROUBLE; } return EXIT_SUCCESS; } static int isLocationDefined (difference_location loc) { return (loc.lineno1 + loc.fieldno1 + loc.lineno2 + loc.fieldno2 > 0 ? 1 : 0); } static void print_statistics (const argslist* list, statlist* statres) { Real qm_abserr, qm_relerr; #ifdef USE_GMP initR (&qm_abserr); initR (&qm_relerr); #endif /* USE_GMP */ if (list->flag > 0) { fputs (_("\n In the computation of the following quantities\n only the errors with positive sign are considered:\n"), stdout); fputs (_(" differences due to numeric fields of the second file that are\n less than the corresponding fields in the first file are neglected\n\n"), stdout); } if (list->flag < 0) { fputs (_("\n In the computation of the following quantities\n only the errors with negative sign are considered:\n"), stdout); fputs (_(" differences due to numeric fields of the second file that are\n greater than the corresponding fields in the first file are neglected\n\n"), stdout); } if ( statres->Ndisperr == 0 ) { if ( statres->Nentries == 0 ) fputs (_("\nNo numeric comparison has been done\n"), stdout); else printf(ngettext ( "\nOne numeric comparison has been done and\nthe resulting numeric difference is negligible\n", "\n%d numeric comparisons have been done and\nthe resulting numeric differences are all negligible\n", statres->Nentries), statres->Nentries); } else if ( statres->Ndisperr == statres->Nentries ) { printf(ngettext ( "\nOne numeric comparison has been done and\nhas produced an outcome beyond the tolerance threshold\n", "\n%d numeric comparisons have been done, all of them\nhave produced an outcome beyond the tolerance threshold\n", statres->Nentries), statres->Nentries); } else { /* Case 0 < LIST->NDISPERR < LIST->NENTRIES */ printf (ngettext ( "\nOne numeric comparison has been done,\n", "\n%d numeric comparisons have been done,\n", statres->Nentries), statres->Nentries); printf (ngettext ( "only one numeric comparison has produced an outcome\nbeyond the tolerance threshold\n", "%d numeric comparisons have produced an outcome\nbeyond the tolerance threshold\n", statres->Ndisperr), statres->Ndisperr); } fputs (_("\nLargest absolute error in the set of the major numerical differences:\n"), stdout); printno (statres->Labserr, DEF_LIM); fputs (_("\nCorresponding relative error:\n"), stdout); printno (statres->Crelerr, DEF_LIM); if ( (isLocationDefined (statres->Labserr_location)) ) { printf (_("\nFirst occurrence (#line, #field) in the first file: %lu, %lu\n"), statres->Labserr_location.lineno1, statres->Labserr_location.fieldno1+1); printf (_("First occurrence (#line, #field) in the second file: %lu, %lu\n"), statres->Labserr_location.lineno2, statres->Labserr_location.fieldno2+1); } fputs (_("\nLargest relative error in the set of the major numerical differences:\n"), stdout); printno (statres->Lrelerr, DEF_LIM); fputs (_("\nCorresponding absolute error:\n"), stdout); printno (statres->Cabserr, DEF_LIM); if ( (isLocationDefined (statres->Rabserr_location)) ) { printf (_("\nFirst occurrence (#line, #field) in the first file: %lu, %lu\n"), statres->Rabserr_location.lineno1, statres->Rabserr_location.fieldno1+1); printf (_("First occurrence (#line, #field) in the second file: %lu, %lu\n"), statres->Rabserr_location.lineno2, statres->Rabserr_location.fieldno2+1); } fputs (_("\n\nSum of all absolute errors:\n"), stdout); printno (statres->N1abserr, DEF_LIM); fputs (_("\nSum of the major absolute errors:\n"), stdout); printno (statres->N1disperr, DEF_LIM); /* Arithmetic means */ divide_by_int (&statres->N1abserr, statres->Nentries, list->iscale); divide_by_int (&statres->N1disperr, statres->Ndisperr, list->iscale); fputs (_("\nArithmetic mean of all absolute errors:\n"), stdout); printno (statres->N1abserr, DEF_LIM); fputs (_("\nArithmetic mean of the major absolute errors:\n"), stdout); printno (statres->N1disperr, DEF_LIM); /* 2-norms and quadratic means of the errors */ copyR (&qm_abserr, statres->N2abserr); divide_by_int (&qm_abserr, statres->Nentries, list->iscale); square_root (&qm_abserr, list->iscale); square_root (&statres->N2abserr, list->iscale); fputs (_("\nSquare root of the sum of the squares of all absolute errors:\n"), stdout); printno (statres->N2abserr, DEF_LIM); fputs (_("\nQuadratic mean of all absolute errors:\n"), stdout); printno (qm_abserr, DEF_LIM); copyR (&qm_relerr, statres->N2disperr); divide_by_int (&qm_relerr, statres->Ndisperr, list->iscale); square_root (&qm_relerr, list->iscale); square_root (&statres->N2disperr, list->iscale); fputs (_("\nSquare root of the sum of the squares\nof the major absolute errors:\n"), stdout); printno (statres->N2disperr, DEF_LIM); fputs (_("\nQuadratic mean of the major absolute errors:\n"), stdout); printno (qm_relerr, DEF_LIM); putchar ('\n'); delR (&qm_relerr); delR (&qm_abserr); } char **def_ifs = NULL; static void clean_memory (argslist* pList, statlist* pRes) { emptyBitVector (&pList->optmask); delete_string_vector (def_ifs); dismiss_mpa_support (pList, pRes); if ((pList->ifs1)) delete_string_vector (pList->ifs1); if ((pList->ifs2)) delete_string_vector (pList->ifs2); } int main (int argc, char* argv[]) { argslist list; statlist statres; int pHelp, pVersion; #ifdef ENABLE_NLS setlocale (LC_CTYPE, ""); setlocale (LC_MESSAGES, ""); #endif bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); def_ifs = ssplit (DEF_IFS, I_DEF_SEP); if (!def_ifs) { fprintf (stderr, _("*** %s: memory exhausted\n"), PACKAGE); return -1; } /* This code was used to discover the reason of a bug */ /* #ifdef __USE_FILE_OFFSET64 printf ("\n %s: FILE OFFSET 64 in use, sizeof (struct stat) = %u\n", __FILE__, sizeof (struct stat)); #else printf ("\n %s: FILE OFFSET 64 NOT in use, sizeof (struct stat) = %u\n", __FILE__, sizeof (struct stat)); #endif */ load_defaults (&list, &statres); init_mpa_support (&list, &statres); init_flags (); if ( setargs (argc, argv, &list) != 0 ) { clean_memory (&list, &statres); return -1; } pHelp = getBitAtPosition (&list.optmask, _H_MASK) == BIT_ON; pVersion = getBitAtPosition (&list.optmask, _V_MASK) == BIT_ON; if ((pHelp) || (pVersion)) { if ((pVersion)) print_version(PACKAGE); if ((pHelp)) print_help(PACKAGE); clean_memory (&list, &statres); return (argc > 2 ? -1 : 0); } else { int test = 0, ident_files = 0; FILE *fp1, *fp2; int qm = getBitAtPosition (&list.optmask, _Q_MASK); if ( open_files (list.file1, list.file2) != EXIT_SUCCESS ) { clean_memory (&list, &statres); return EXIT_TROUBLE; } if (getBitAtPosition (&list.optmask, _F_MASK) == BIT_ON || getBitAtPosition (&list.optmask, _Z_MASK) == BIT_ON || getBitAtPosition (&list.optmask, _SZ_MASK) == BIT_ON ) test = compare_files (&list, &ident_files); if (test < 0) { fputs (_("\n*** The requested comparison cannot be performed:\n"), stdout); printf (_("*** At least one between \"%s\" and \"%s\" is a binary file\n"), list.file1, list.file2); clean_memory (&list, &statres); close_files (); return EXIT_TROUBLE; } if ( getBitAtPosition (&list.optmask, _F_MASK) == BIT_OFF && !ident_files ) { if ( rewind_files () != EXIT_SUCCESS || set_file_pointers (&fp1, &fp2) != EXIT_SUCCESS ) { clean_memory (&list, &statres); close_files (); return EXIT_TROUBLE; } test = cmp_files (fp1, fp2, &list, &statres); if (getBitAtPosition (&list.optmask, _SS_MASK) == BIT_ON && test <= 1) print_statistics (&list, &statres); } if (test == 0 && !qm) { if (getBitAtPosition (&list.optmask, _F_MASK) == BIT_ON) printf (_("\n+++ Files \"%s\" and \"%s\" have the same structure\n"), list.file1, list.file2); else printf (_("\n+++ Files \"%s\" and \"%s\" are equal\n"), list.file1, list.file2); } if (test == 1 && !qm) printf (_("\n+++ File \"%s\" differs from file \"%s\"\n"), list.file1, list.file2); erase_flags (); clean_memory (&list, &statres); close_files (); return test; } } numdiff-5.9.0/aclocal.m40000644000175000017500000000121713054341114014336 0ustar paologpaolog# generated automatically by aclocal 1.10.1 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # 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_include([m4/setmode.m4]) m4_include([m4/st_mtim.m4]) numdiff-5.9.0/configure0000755000175000017500000113353513054341114014417 0ustar paologpaolog#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.63 for Numdiff 5.8. # # Report bugs to <>. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 # PATH needs CR # 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_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 if (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 # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # Required to use basename. 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 # Name of the executable. 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'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF 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 : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF 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_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell bug-autoconf@gnu.org about your system, echo including any error possibly output before this message. echo This can help us improve future autoconf versions. echo Configuration will now proceed without shell functions. } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. 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 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' 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=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='Numdiff' PACKAGE_TARNAME='numdiff' PACKAGE_VERSION='5.8' PACKAGE_STRING='Numdiff 5.8' PACKAGE_BUGREPORT='' ac_unique_file="numdiff.h" # 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 SET_MAKE LIB_CLOCK_GETTIME INSTINFO FIND EGREP GREP CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC 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_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_debug enable_optimization enable_nls enable_gmp enable_largefile ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null 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=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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 { (exit 1); exit 1; }; } 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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 { (exit 1); exit 1; }; } 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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 { (exit 1); exit 1; }; } 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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 { (exit 1); exit 1; }; } 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_echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } 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_echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 { (exit 1); exit 1; }; } ;; *) $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_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } 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 $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes 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_echo "$as_me: error: working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then 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_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } 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 Numdiff 5.8 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/numdiff] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of Numdiff 5.8:";; 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-debug turn on debugging default=no --enable-optimization turn on basic optimization default=no --enable-nls turn on Natural Language Support default=yes --enable-gmp turn on use of GNU MP default=yes --disable-largefile omit support for large files 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 C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor 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 Numdiff configure 5.8 generated by GNU Autoconf 2.63 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 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 Numdiff $as_me 5.8, which was generated by GNU Autoconf 2.63. 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) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$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 ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # 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 cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:$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= ;; #( *) $as_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 cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX 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 cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX 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 cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX 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'; { (exit 1); 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 # 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 # 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 ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test -r "$ac_site_file"; then { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { $as_echo "$as_me:$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:$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:$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:$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:$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:$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:$LINENO: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:$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. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:$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_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 $as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } 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 ac_config_headers="$ac_config_headers config.h" if test "x$DBGFLAGS" = "x"; then DBGFLAGS="-g" fi if test "x$OPTFLAGS" = "x"; then OPTFLAGS="-O" fi CPPFLAGS="${CPPFLAGS:=}" CFLAGS="${CFLAGS:=}" LDFLAGS="${LDFLAGS:=}" LIBS="${LIBS:=}" CPPFLAGS="$CPPFLAGS -DHAVE_CONFIG_H" if test "`$CPP -v < /dev/null 2>&1 | grep '/usr/local/include' 2>&1`" = ""; then CPPFLAGS="$CPPFLAGS -I/usr/local/include" LDFLAGS="$LDFLAGS -L/usr/local/lib" 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:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:$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:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:$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:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$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:$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:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:$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:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:$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:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:$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:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:$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:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$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:$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:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 $as_echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } # Provide some information about the compiler. $as_echo "$as_me:$LINENO: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF 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:$LINENO: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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 { $as_echo "$as_me:$LINENO: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } if test -z "$ac_file"; then $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 $as_echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } fi fi fi { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } { $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } { $as_echo "$as_me:$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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } fi rm -f conftest$ac_cv_exeext { $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 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:$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:$LINENO: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 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:$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:$LINENO: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 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:$LINENO: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:$LINENO: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu 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:$LINENO: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then $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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:$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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 $as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } 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:$LINENO: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if test "${ac_cv_path_GREP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` 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_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 $as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:$LINENO: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if test "${ac_cv_path_EGREP+set}" = set; then $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` 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_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 $as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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 rm -f 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : 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 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF 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` { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test "${ac_cv_header_minix_config_h+set}" = set; then { $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5 $as_echo_n "checking for minix/config.h... " >&6; } if test "${ac_cv_header_minix_config_h+set}" = set; then $as_echo_n "(cached) " >&6 fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 $as_echo "$ac_cv_header_minix_config_h" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking minix/config.h usability" >&5 $as_echo_n "checking minix/config.h usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking minix/config.h presence" >&5 $as_echo_n "checking minix/config.h presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$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:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: minix/config.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: minix/config.h: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: minix/config.h: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: minix/config.h: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------------- ## ## Report this to ## ## ----------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5 $as_echo_n "checking for minix/config.h... " >&6; } if test "${ac_cv_header_minix_config_h+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_header_minix_config_h=$ac_header_preproc fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 $as_echo "$ac_cv_header_minix_config_h" >&6; } fi if test "x$ac_cv_header_minix_config_h" = x""yes; then MINIX=yes else MINIX= fi if test "$MINIX" = yes; then cat >>confdefs.h <<\_ACEOF #define _POSIX_SOURCE 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _POSIX_1_SOURCE 2 _ACEOF cat >>confdefs.h <<\_ACEOF #define _MINIX 1 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if test "${ac_cv_safe_to_define___extensions__+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_safe_to_define___extensions__=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && cat >>confdefs.h <<\_ACEOF #define __EXTENSIONS__ 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _ALL_SOURCE 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _GNU_SOURCE 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _POSIX_PTHREAD_SEMANTICS 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _TANDEM_SOURCE 1 _ACEOF # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then enableval=$enable_debug; else enable_debug=no fi # Check whether --enable-optimization was given. if test "${enable_optimization+set}" = set; then enableval=$enable_optimization; else enable_optimization=no fi # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then enableval=$enable_nls; else enable_nls=yes fi # Check whether --enable-gmp was given. if test "${enable_gmp+set}" = set; then enableval=$enable_gmp; else enable_gmp=yes 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:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:$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:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:$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:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$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:$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:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:$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:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:$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:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:$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:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:$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:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$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:$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:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 $as_echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } # Provide some information about the compiler. $as_echo "$as_me:$LINENO: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 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:$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:$LINENO: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 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:$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:$LINENO: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 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:$LINENO: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:$LINENO: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "x$CC" != xcc; then { $as_echo "$as_me:$LINENO: checking whether $CC and cc understand -c and -o together" >&5 $as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } else { $as_echo "$as_me:$LINENO: checking whether cc understands -c and -o together" >&5 $as_echo_n "checking whether cc understands -c and -o together... " >&6; } fi set dummy $CC; ac_cc=`$as_echo "$2" | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # We do the test twice because some compilers refuse to overwrite an # existing .o file with -o, though they will create one. ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -f conftest2.$ac_objext && { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then eval ac_cv_prog_cc_${ac_cc}_c_o=yes if test "x$CC" != xcc; then # Test first that cc exists at all. if { ac_try='cc -c conftest.$ac_ext >&5' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -f conftest2.$ac_objext && { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # cc works too. : else # cc exists but doesn't like -o. eval ac_cv_prog_cc_${ac_cc}_c_o=no fi fi fi else eval ac_cv_prog_cc_${ac_cc}_c_o=no fi rm -f core conftest* fi if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } cat >>confdefs.h <<\_ACEOF #define NO_MINUS_C_MINUS_O 1 _ACEOF 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:$LINENO: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then $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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:$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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 $as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } 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 # Extract the first word of "find", so it can be a program name with args. set dummy find; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_FIND+set}" = set; then $as_echo_n "(cached) " >&6 else case $FIND in [\\/]* | ?:[\\/]*) ac_cv_path_FIND="$FIND" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_FIND="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi FIND=$ac_cv_path_FIND if test -n "$FIND"; then { $as_echo "$as_me:$LINENO: result: $FIND" >&5 $as_echo "$FIND" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi for ac_prog in install-info ginstall-info 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:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_INSTINFO+set}" = set; then $as_echo_n "(cached) " >&6 else case $INSTINFO in [\\/]* | ?:[\\/]*) ac_cv_path_INSTINFO="$INSTINFO" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INSTINFO="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INSTINFO=$ac_cv_path_INSTINFO if test -n "$INSTINFO"; then { $as_echo "$as_me:$LINENO: result: $INSTINFO" >&5 $as_echo "$INSTINFO" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -n "$INSTINFO" && break done { $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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 rm -f 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : 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 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi if test $ac_cv_header_stdc = yes; then { $as_echo "$as_me:$LINENO: result: Ok! I have just found them." >&5 $as_echo "Ok! I have just found them." >&6; } else { { $as_echo "$as_me:$LINENO: error: Cannot find ANSI C header files!" >&5 $as_echo "$as_me: error: Cannot find ANSI C header files!" >&2;} { (exit 1); exit 1; }; } fi { $as_echo "$as_me:$LINENO: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if test "${ac_cv_header_stdbool_h+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #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]; bool e = &s; 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]; # if defined __xlc__ || defined __GNUC__ /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0 reported by James Lemley on 2005-10-05; see http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html This test is not quite right, since xlc is allowed to reject this program, as the initializer for xlcbug is not one of the forms that C requires support for. However, doing the test right would require a runtime test, and that would make cross-compilation harder. Let us hope that IBM fixes the xlc bug, and also adds support for this kind of constant expression. In the meantime, this test will reject xlc, which is OK, since our stdbool.h substitute should suffice. We also test this with GCC, where it should work, to detect more quickly whether someone messes up the test in the future. */ char digs[] = "0123456789"; int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1); # endif /* 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 () { *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 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdbool_h=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } { $as_echo "$as_me:$LINENO: checking for _Bool" >&5 $as_echo_n "checking for _Bool... " >&6; } if test "${ac_cv_type__Bool+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_type__Bool=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof (_Bool)) return 0; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof ((_Bool))) return 0; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type__Bool=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_type__Bool" >&5 $as_echo "$ac_cv_type__Bool" >&6; } if test "x$ac_cv_type__Bool" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_STDBOOL_H 1 _ACEOF fi for ac_header in fcntl.h locale.h stddef.h \ stdlib.h string.h sys/file.h time.h unistd.h wchar.h wctype.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 $as_echo_n "checking $ac_header usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 $as_echo_n "checking $ac_header presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$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:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------------- ## ## Report this to ## ## ----------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done 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:$LINENO: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = 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:$LINENO: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_search_opendir=$ac_res else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:$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:$LINENO: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_search_opendir=$ac_res else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:$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 { $as_echo "$as_me:$LINENO: checking whether stat file-mode macros are broken" >&5 $as_echo_n "checking whether stat file-mode macros are broken... " >&6; } if test "${ac_cv_header_stat_broken+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if defined S_ISBLK && defined S_IFDIR extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1]; #endif #if defined S_ISBLK && defined S_IFCHR extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1]; #endif #if defined S_ISLNK && defined S_IFREG extern char c3[S_ISLNK (S_IFREG) ? -1 : 1]; #endif #if defined S_ISSOCK && defined S_IFREG extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1]; #endif _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stat_broken=no else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stat_broken=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_stat_broken" >&5 $as_echo "$ac_cv_header_stat_broken" >&6; } if test $ac_cv_header_stat_broken = yes; then cat >>confdefs.h <<\_ACEOF #define STAT_MACROS_BROKEN 1 _ACEOF fi { $as_echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5 $as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } if test "${ac_cv_header_sys_wait_h+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_sys_wait_h=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 $as_echo "$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_SYS_WAIT_H 1 _ACEOF fi # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:$LINENO: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if test "${ac_cv_sys_largefile_CC+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then break else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_sys_largefile_CC=' -n32'; break else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:$LINENO: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if test "${ac_cv_sys_file_offset_bits+set}" = set; then $as_echo_n "(cached) " >&6 else while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_sys_file_offset_bits=no; break else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_sys_file_offset_bits=64; break else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:$LINENO: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:$LINENO: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if test "${ac_cv_sys_large_files+set}" = set; then $as_echo_n "(cached) " >&6 else while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_sys_large_files=no; break else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_sys_large_files=1; break else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:$LINENO: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi { $as_echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if test "${ac_cv_c_const+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* 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. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; 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 saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; 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 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_c_const=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then cat >>confdefs.h <<\_ACEOF #define const /**/ _ACEOF fi { $as_echo "$as_me:$LINENO: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if test "${ac_cv_c_inline+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_c_inline=$ac_kw else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac { $as_echo "$as_me:$LINENO: checking for variable-length arrays" >&5 $as_echo_n "checking for variable-length arrays... " >&6; } if test "${ac_cv_c_vararrays+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { static int x; char a[++x]; a[sizeof a - 1] = 0; return a[0]; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_c_vararrays=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_vararrays=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_c_vararrays" >&5 $as_echo "$ac_cv_c_vararrays" >&6; } if test $ac_cv_c_vararrays = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_C_VARARRAYS 1 _ACEOF fi { $as_echo "$as_me:$LINENO: checking for size_t" >&5 $as_echo_n "checking for size_t... " >&6; } if test "${ac_cv_type_size_t+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_type_size_t=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof (size_t)) return 0; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof ((size_t))) return 0; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_size_t=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 $as_echo "$ac_cv_type_size_t" >&6; } if test "x$ac_cv_type_size_t" = x""yes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:$LINENO: checking for pid_t" >&5 $as_echo_n "checking for pid_t... " >&6; } if test "${ac_cv_type_pid_t+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_type_pid_t=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof (pid_t)) return 0; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof ((pid_t))) return 0; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_pid_t=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5 $as_echo "$ac_cv_type_pid_t" >&6; } if test "x$ac_cv_type_pid_t" = x""yes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi { $as_echo "$as_me:$LINENO: checking for ptrdiff_t" >&5 $as_echo_n "checking for ptrdiff_t... " >&6; } if test "${ac_cv_type_ptrdiff_t+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_type_ptrdiff_t=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof (ptrdiff_t)) return 0; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof ((ptrdiff_t))) return 0; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_ptrdiff_t=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_type_ptrdiff_t" >&5 $as_echo "$ac_cv_type_ptrdiff_t" >&6; } if test "x$ac_cv_type_ptrdiff_t" = x""yes; then : else cat >>confdefs.h <<_ACEOF #define ptrdiff_t int _ACEOF fi { $as_echo "$as_me:$LINENO: checking for ssize_t" >&5 $as_echo_n "checking for ssize_t... " >&6; } if test "${ac_cv_type_ssize_t+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_type_ssize_t=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof (ssize_t)) return 0; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if (sizeof ((ssize_t))) return 0; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_ssize_t=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_type_ssize_t" >&5 $as_echo "$ac_cv_type_ssize_t" >&6; } if test "x$ac_cv_type_ssize_t" = x""yes; then : else cat >>confdefs.h <<_ACEOF #define ssize_t int _ACEOF fi { $as_echo "$as_me:$LINENO: checking for struct stat.st_blksize" >&5 $as_echo_n "checking for struct stat.st_blksize... " >&6; } if test "${ac_cv_member_struct_stat_st_blksize+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static struct stat ac_aggr; if (ac_aggr.st_blksize) return 0; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_member_struct_stat_st_blksize=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static struct stat ac_aggr; if (sizeof ac_aggr.st_blksize) return 0; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_member_struct_stat_st_blksize=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_member_struct_stat_st_blksize=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_member_struct_stat_st_blksize" >&5 $as_echo "$ac_cv_member_struct_stat_st_blksize" >&6; } if test "x$ac_cv_member_struct_stat_st_blksize" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BLKSIZE 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define HAVE_ST_BLKSIZE 1 _ACEOF fi { $as_echo "$as_me:$LINENO: checking for struct stat.st_rdev" >&5 $as_echo_n "checking for struct stat.st_rdev... " >&6; } if test "${ac_cv_member_struct_stat_st_rdev+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static struct stat ac_aggr; if (ac_aggr.st_rdev) return 0; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_member_struct_stat_st_rdev=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static struct stat ac_aggr; if (sizeof ac_aggr.st_rdev) return 0; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_member_struct_stat_st_rdev=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_member_struct_stat_st_rdev=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_member_struct_stat_st_rdev" >&5 $as_echo "$ac_cv_member_struct_stat_st_rdev" >&6; } if test "x$ac_cv_member_struct_stat_st_rdev" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_RDEV 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define HAVE_ST_RDEV 1 _ACEOF fi { $as_echo "$as_me:$LINENO: checking for nanoseconds member of struct stat.st_mtim" >&5 $as_echo_n "checking for nanoseconds member of struct stat.st_mtim... " >&6; } if test "${ac_cv_struct_st_mtim_nsec+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_CPPFLAGS="$CPPFLAGS" ac_cv_struct_st_mtim_nsec=no # tv_nsec -- the usual case # _tv_nsec -- Solaris 2.6, if # (defined _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED == 1 # && !defined __EXTENSIONS__) # st__tim.tv_nsec -- UnixWare 2.1.2 for ac_val in tv_nsec _tv_nsec st__tim.tv_nsec; do CPPFLAGS="$ac_save_CPPFLAGS -DST_MTIM_NSEC=$ac_val" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { struct stat s; s.st_mtim.ST_MTIM_NSEC; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_struct_st_mtim_nsec=$ac_val; break else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done CPPFLAGS="$ac_save_CPPFLAGS" fi { $as_echo "$as_me:$LINENO: result: $ac_cv_struct_st_mtim_nsec" >&5 $as_echo "$ac_cv_struct_st_mtim_nsec" >&6; } if test $ac_cv_struct_st_mtim_nsec != no; then cat >>confdefs.h <<_ACEOF #define ST_MTIM_NSEC $ac_cv_struct_st_mtim_nsec _ACEOF fi if test "x$enable_gmp" = "xyes"; then { $as_echo "$as_me:$LINENO: checking for __gmpz_init in -lgmp" >&5 $as_echo_n "checking for __gmpz_init in -lgmp... " >&6; } if test "${ac_cv_lib_gmp___gmpz_init+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgmp $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any 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 __gmpz_init (); int main () { return __gmpz_init (); ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_gmp___gmpz_init=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_gmp___gmpz_init=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_gmp___gmpz_init" >&5 $as_echo "$ac_cv_lib_gmp___gmpz_init" >&6; } if test "x$ac_cv_lib_gmp___gmpz_init" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBGMP 1 _ACEOF LIBS="-lgmp $LIBS" fi fi if test "x$enable_nls" = "xyes"; then { $as_echo "$as_me:$LINENO: checking for setlocale in -lintl" >&5 $as_echo_n "checking for setlocale in -lintl... " >&6; } if test "${ac_cv_lib_intl_setlocale+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any 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 setlocale (); int main () { return setlocale (); ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_intl_setlocale=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_intl_setlocale=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_intl_setlocale" >&5 $as_echo "$ac_cv_lib_intl_setlocale" >&6; } if test "x$ac_cv_lib_intl_setlocale" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBINTL 1 _ACEOF LIBS="-lintl $LIBS" fi fi HAVE_VSPRINTF=0 { $as_echo "$as_me:$LINENO: checking for vsprintf" >&5 $as_echo_n "checking for vsprintf... " >&6; } if test "${ac_cv_func_vsprintf+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define vsprintf to an innocuous variant, in case declares vsprintf. For example, HP-UX 11i declares gettimeofday. */ #define vsprintf innocuous_vsprintf /* System header to define __stub macros and hopefully few prototypes, which can conflict with char vsprintf (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef vsprintf /* 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 vsprintf (); /* 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_vsprintf || defined __stub___vsprintf choke me #endif int main () { return vsprintf (); ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_func_vsprintf=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_vsprintf=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_vsprintf" >&5 $as_echo "$ac_cv_func_vsprintf" >&6; } if test "x$ac_cv_func_vsprintf" = x""yes; then HAVE_VSPRINTF=1 fi if test $HAVE_VSPRINTF = 0; then { { $as_echo "$as_me:$LINENO: error: Declaration of vsprintf() not present!" >&5 $as_echo "$as_me: error: Declaration of vsprintf() not present!" >&2;} { (exit 1); exit 1; }; } else { $as_echo "$as_me:$LINENO: result: Ok! vsprintf() is declared." >&5 $as_echo "Ok! vsprintf() is declared." >&6; } fi HAVE_MEMSET=0 { $as_echo "$as_me:$LINENO: checking for memset" >&5 $as_echo_n "checking for memset... " >&6; } if test "${ac_cv_func_memset+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define memset to an innocuous variant, in case declares memset. For example, HP-UX 11i declares gettimeofday. */ #define memset innocuous_memset /* System header to define __stub macros and hopefully few prototypes, which can conflict with char memset (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef memset /* 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 memset (); /* 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_memset || defined __stub___memset choke me #endif int main () { return memset (); ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_func_memset=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_memset=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_memset" >&5 $as_echo "$ac_cv_func_memset" >&6; } if test "x$ac_cv_func_memset" = x""yes; then HAVE_MEMSET=1 fi if test $HAVE_MEMSET = 0; then { { $as_echo "$as_me:$LINENO: error: Declaration of memset() not present!" >&5 $as_echo "$as_me: error: Declaration of memset() not present!" >&2;} { (exit 1); exit 1; }; } else { $as_echo "$as_me:$LINENO: result: Ok! memset() is declared." >&5 $as_echo "Ok! memset() is declared." >&6; } fi HAVE_MEMCHR=0 { $as_echo "$as_me:$LINENO: checking for memchr" >&5 $as_echo_n "checking for memchr... " >&6; } if test "${ac_cv_func_memchr+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define memchr to an innocuous variant, in case declares memchr. For example, HP-UX 11i declares gettimeofday. */ #define memchr innocuous_memchr /* System header to define __stub macros and hopefully few prototypes, which can conflict with char memchr (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef memchr /* 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 memchr (); /* 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_memchr || defined __stub___memchr choke me #endif int main () { return memchr (); ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_func_memchr=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_memchr=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_memchr" >&5 $as_echo "$ac_cv_func_memchr" >&6; } if test "x$ac_cv_func_memchr" = x""yes; then HAVE_MEMCHR=1 fi if test $HAVE_MEMCHR = 0; then { { $as_echo "$as_me:$LINENO: error: Declaration of memchr() not present!" >&5 $as_echo "$as_me: error: Declaration of memchr() not present!" >&2;} { (exit 1); exit 1; }; } else { $as_echo "$as_me:$LINENO: result: Ok! memchr() is declared." >&5 $as_echo "Ok! memchr() is declared." >&6; } fi HAVE_STRERROR=0 { $as_echo "$as_me:$LINENO: checking for strerror" >&5 $as_echo_n "checking for strerror... " >&6; } if test "${ac_cv_func_strerror+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define strerror to an innocuous variant, in case declares strerror. For example, HP-UX 11i declares gettimeofday. */ #define strerror innocuous_strerror /* System header to define __stub macros and hopefully few prototypes, which can conflict with char strerror (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef strerror /* 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 strerror (); /* 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_strerror || defined __stub___strerror choke me #endif int main () { return strerror (); ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_func_strerror=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_strerror=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_strerror" >&5 $as_echo "$ac_cv_func_strerror" >&6; } if test "x$ac_cv_func_strerror" = x""yes; then HAVE_STRERROR=1 fi if test $HAVE_STRERROR = 0; then { { $as_echo "$as_me:$LINENO: error: Declaration of strerror() not present!" >&5 $as_echo "$as_me: error: Declaration of strerror() not present!" >&2;} { (exit 1); exit 1; }; } else { $as_echo "$as_me:$LINENO: result: Ok! strerror() is declared." >&5 $as_echo "Ok! strerror() is declared." >&6; } fi HAVE_STRSPN=0 { $as_echo "$as_me:$LINENO: checking for strspn" >&5 $as_echo_n "checking for strspn... " >&6; } if test "${ac_cv_func_strspn+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define strspn to an innocuous variant, in case declares strspn. For example, HP-UX 11i declares gettimeofday. */ #define strspn innocuous_strspn /* System header to define __stub macros and hopefully few prototypes, which can conflict with char strspn (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef strspn /* 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 strspn (); /* 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_strspn || defined __stub___strspn choke me #endif int main () { return strspn (); ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_func_strspn=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_strspn=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_strspn" >&5 $as_echo "$ac_cv_func_strspn" >&6; } if test "x$ac_cv_func_strspn" = x""yes; then HAVE_STRSPN=1 fi if test $HAVE_STRSPN = 0; then { { $as_echo "$as_me:$LINENO: error: Declaration of strspn() not present!" >&5 $as_echo "$as_me: error: Declaration of strspn() not present!" >&2;} { (exit 1); exit 1; }; } else { $as_echo "$as_me:$LINENO: result: Ok! strspn() is declared." >&5 $as_echo "Ok! strspn() is declared." >&6; } fi HAVE_STRCSPN=0 { $as_echo "$as_me:$LINENO: checking for strcspn" >&5 $as_echo_n "checking for strcspn... " >&6; } if test "${ac_cv_func_strcspn+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define strcspn to an innocuous variant, in case declares strcspn. For example, HP-UX 11i declares gettimeofday. */ #define strcspn innocuous_strcspn /* System header to define __stub macros and hopefully few prototypes, which can conflict with char strcspn (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef strcspn /* 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 strcspn (); /* 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_strcspn || defined __stub___strcspn choke me #endif int main () { return strcspn (); ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_func_strcspn=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_strcspn=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_strcspn" >&5 $as_echo "$ac_cv_func_strcspn" >&6; } if test "x$ac_cv_func_strcspn" = x""yes; then HAVE_STRCSPN=1 fi if test $HAVE_STRCSPN = 0; then { { $as_echo "$as_me:$LINENO: error: Declaration of strcspn() not present!" >&5 $as_echo "$as_me: error: Declaration of strcspn() not present!" >&2;} { (exit 1); exit 1; }; } else { $as_echo "$as_me:$LINENO: result: Ok! strcspn() is declared." >&5 $as_echo "Ok! strcspn() is declared." >&6; } fi { $as_echo "$as_me:$LINENO: checking whether strerror_r is declared" >&5 $as_echo_n "checking whether strerror_r is declared... " >&6; } if test "${ac_cv_have_decl_strerror_r+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef strerror_r (void) strerror_r; #endif ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_strerror_r=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_strerror_r=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_strerror_r" >&5 $as_echo "$ac_cv_have_decl_strerror_r" >&6; } if test "x$ac_cv_have_decl_strerror_r" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRERROR_R 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRERROR_R 0 _ACEOF fi for ac_func in strerror_r do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 $as_echo_n "checking for $ac_func... " >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any 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 $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$as_ac_var=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:$LINENO: checking whether strerror_r returns char *" >&5 $as_echo_n "checking whether strerror_r returns char *... " >&6; } if test "${ac_cv_func_strerror_r_char_p+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_func_strerror_r_char_p=no if test $ac_cv_have_decl_strerror_r = yes; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { char buf[100]; char x = *strerror_r (0, buf, sizeof buf); char *p = strerror_r (0, buf, sizeof buf); return !p || x; ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_func_strerror_r_char_p=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else # strerror_r is not declared. Choose between # systems that have relatively inaccessible declarations for the # function. BeOS and DEC UNIX 4.0 fall in this category, but the # former has a strerror_r that returns char*, while the latter # has a strerror_r that returns `int'. # This test should segfault on the DEC system. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default extern char *strerror_r (); int main () { char buf[100]; char x = *strerror_r (0, buf, sizeof buf); return ! isalpha (x); ; return 0; } _ACEOF rm -f 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_strerror_r_char_p=yes 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 fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_strerror_r_char_p" >&5 $as_echo "$ac_cv_func_strerror_r_char_p" >&6; } if test $ac_cv_func_strerror_r_char_p = yes; then cat >>confdefs.h <<\_ACEOF #define STRERROR_R_CHAR_P 1 _ACEOF fi for ac_header in vfork.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 $as_echo_n "checking $ac_header usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 $as_echo_n "checking $ac_header presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$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:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------------- ## ## Report this to ## ## ----------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in fork vfork do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 $as_echo_n "checking for $ac_func... " >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any 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 $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$as_ac_var=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "x$ac_cv_func_fork" = xyes; then { $as_echo "$as_me:$LINENO: checking for working fork" >&5 $as_echo_n "checking for working fork... " >&6; } if test "${ac_cv_func_fork_works+set}" = set; then $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then ac_cv_func_fork_works=cross else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { /* By Ruediger Kuhlmann. */ return fork () < 0; ; return 0; } _ACEOF rm -f 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_fork_works=yes 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 ( exit $ac_status ) ac_cv_func_fork_works=no fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_fork_works" >&5 $as_echo "$ac_cv_func_fork_works" >&6; } else ac_cv_func_fork_works=$ac_cv_func_fork fi if test "x$ac_cv_func_fork_works" = xcross; then case $host in *-*-amigaos* | *-*-msdosdjgpp*) # Override, as these systems have only a dummy fork() stub ac_cv_func_fork_works=no ;; *) ac_cv_func_fork_works=yes ;; esac { $as_echo "$as_me:$LINENO: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} fi ac_cv_func_vfork_works=$ac_cv_func_vfork if test "x$ac_cv_func_vfork" = xyes; then { $as_echo "$as_me:$LINENO: checking for working vfork" >&5 $as_echo_n "checking for working vfork... " >&6; } if test "${ac_cv_func_vfork_works+set}" = set; then $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then ac_cv_func_vfork_works=cross else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Thanks to Paul Eggert for this test. */ $ac_includes_default #include #ifdef HAVE_VFORK_H # include #endif /* On some sparc systems, changes by the child to local and incoming argument registers are propagated back to the parent. The compiler is told about this with #include , but some compilers (e.g. gcc -O) don't grok . Test for this by using a static variable whose address is put into a register that is clobbered by the vfork. */ static void #ifdef __cplusplus sparc_address_test (int arg) # else sparc_address_test (arg) int arg; #endif { static pid_t child; if (!child) { child = vfork (); if (child < 0) { perror ("vfork"); _exit(2); } if (!child) { arg = getpid(); write(-1, "", 0); _exit (arg); } } } int main () { pid_t parent = getpid (); pid_t child; sparc_address_test (0); child = vfork (); if (child == 0) { /* Here is another test for sparc vfork register problems. This test uses lots of local variables, at least as many local variables as main has allocated so far including compiler temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should reuse the register of parent for one of the local variables, since it will think that parent can't possibly be used any more in this routine. Assigning to the local variable will thus munge parent in the parent process. */ pid_t p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); /* Convince the compiler that p..p7 are live; otherwise, it might use the same hardware register for all 8 local variables. */ if (p != p1 || p != p2 || p != p3 || p != p4 || p != p5 || p != p6 || p != p7) _exit(1); /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent from child file descriptors. If the child closes a descriptor before it execs or exits, this munges the parent's descriptor as well. Test for this by closing stdout in the child. */ _exit(close(fileno(stdout)) != 0); } else { int status; struct stat st; while (wait(&status) != child) ; return ( /* Was there some problem with vforking? */ child < 0 /* Did the child fail? (This shouldn't happen.) */ || status /* Did the vfork/compiler bug occur? */ || parent != getpid() /* Did the file descriptor bug occur? */ || fstat(fileno(stdout), &st) != 0 ); } } _ACEOF rm -f 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_vfork_works=yes 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 ( exit $ac_status ) ac_cv_func_vfork_works=no fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_vfork_works" >&5 $as_echo "$ac_cv_func_vfork_works" >&6; } fi; if test "x$ac_cv_func_fork_works" = xcross; then ac_cv_func_vfork_works=$ac_cv_func_vfork { $as_echo "$as_me:$LINENO: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} fi if test "x$ac_cv_func_vfork_works" = xyes; then cat >>confdefs.h <<\_ACEOF #define HAVE_WORKING_VFORK 1 _ACEOF else cat >>confdefs.h <<\_ACEOF #define vfork fork _ACEOF fi if test "x$ac_cv_func_fork_works" = xyes; then cat >>confdefs.h <<\_ACEOF #define HAVE_WORKING_FORK 1 _ACEOF fi for ac_func in localeconv gettimeofday isascii setlocale strchr strftime waitpid do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 $as_echo_n "checking for $ac_func... " >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any 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 $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$as_ac_var=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # setmode DOS ? for ac_header in fcntl.h unistd.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 $as_echo_n "checking $ac_header usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 $as_echo_n "checking $ac_header presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$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:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------------- ## ## Report this to ## ## ----------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:$LINENO: checking for DOS-style setmode" >&5 $as_echo_n "checking for DOS-style setmode... " >&6; } if test "${ac_cv_func_setmode_dos+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #if HAVE_FCNTL_H # include #endif #if HAVE_UNISTD_H # include #endif int main () { int ret = setmode && setmode (1, O_BINARY); ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_func_setmode_dos=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_setmode_dos=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_setmode_dos" >&5 $as_echo "$ac_cv_func_setmode_dos" >&6; } if test $ac_cv_func_setmode_dos = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_SETMODE_DOS 1 _ACEOF fi # Check for clock_gettime and its library. Solaris puts it in -lrt or # -lposix4, but we don't want to link that library unless we have to. diff_saved_libs=$LIBS { $as_echo "$as_me:$LINENO: checking for library containing clock_gettime" >&5 $as_echo_n "checking for library containing clock_gettime... " >&6; } if test "${ac_cv_search_clock_gettime+set}" = set; then $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any 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 clock_gettime (); int main () { return clock_gettime (); ; return 0; } _ACEOF for ac_lib in '' rt posix4; 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 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_search_clock_gettime=$ac_res else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext if test "${ac_cv_search_clock_gettime+set}" = set; then break fi done if test "${ac_cv_search_clock_gettime+set}" = set; then : else ac_cv_search_clock_gettime=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_search_clock_gettime" >&5 $as_echo "$ac_cv_search_clock_gettime" >&6; } ac_res=$ac_cv_search_clock_gettime if test "$ac_res" != no; then test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi case $ac_cv_search_clock_gettime in no | 'none required') LIB_CLOCK_GETTIME=;; *) LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime;; esac for ac_func in clock_gettime do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 $as_echo_n "checking for $ac_func... " >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any 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 $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$as_ac_var=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done LIBS=$diff_saved_libs cat >>confdefs.h <<\_ACEOF #define USE_UNLOCKED_IO 1 _ACEOF { $as_echo "$as_me:$LINENO: checking whether clearerr_unlocked is declared" >&5 $as_echo_n "checking whether clearerr_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_clearerr_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef clearerr_unlocked (void) clearerr_unlocked; #endif ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_clearerr_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_clearerr_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_clearerr_unlocked" >&5 $as_echo "$ac_cv_have_decl_clearerr_unlocked" >&6; } if test "x$ac_cv_have_decl_clearerr_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_CLEARERR_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_CLEARERR_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether feof_unlocked is declared" >&5 $as_echo_n "checking whether feof_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_feof_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef feof_unlocked (void) feof_unlocked; #endif ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_feof_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_feof_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_feof_unlocked" >&5 $as_echo "$ac_cv_have_decl_feof_unlocked" >&6; } if test "x$ac_cv_have_decl_feof_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FEOF_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FEOF_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether ferror_unlocked is declared" >&5 $as_echo_n "checking whether ferror_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_ferror_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef ferror_unlocked (void) ferror_unlocked; #endif ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_ferror_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_ferror_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_ferror_unlocked" >&5 $as_echo "$ac_cv_have_decl_ferror_unlocked" >&6; } if test "x$ac_cv_have_decl_ferror_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FERROR_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FERROR_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether fflush_unlocked is declared" >&5 $as_echo_n "checking whether fflush_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_fflush_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef fflush_unlocked (void) fflush_unlocked; #endif ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_fflush_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_fflush_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_fflush_unlocked" >&5 $as_echo "$ac_cv_have_decl_fflush_unlocked" >&6; } if test "x$ac_cv_have_decl_fflush_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FFLUSH_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FFLUSH_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether fgets_unlocked is declared" >&5 $as_echo_n "checking whether fgets_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_fgets_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef fgets_unlocked (void) fgets_unlocked; #endif ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_fgets_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_fgets_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_fgets_unlocked" >&5 $as_echo "$ac_cv_have_decl_fgets_unlocked" >&6; } if test "x$ac_cv_have_decl_fgets_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FGETS_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FGETS_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether fputc_unlocked is declared" >&5 $as_echo_n "checking whether fputc_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_fputc_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef fputc_unlocked (void) fputc_unlocked; #endif ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_fputc_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_fputc_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_fputc_unlocked" >&5 $as_echo "$ac_cv_have_decl_fputc_unlocked" >&6; } if test "x$ac_cv_have_decl_fputc_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FPUTC_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FPUTC_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether fputs_unlocked is declared" >&5 $as_echo_n "checking whether fputs_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_fputs_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef fputs_unlocked (void) fputs_unlocked; #endif ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_fputs_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_fputs_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_fputs_unlocked" >&5 $as_echo "$ac_cv_have_decl_fputs_unlocked" >&6; } if test "x$ac_cv_have_decl_fputs_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FPUTS_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FPUTS_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether fread_unlocked is declared" >&5 $as_echo_n "checking whether fread_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_fread_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef fread_unlocked (void) fread_unlocked; #endif ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_fread_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_fread_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_fread_unlocked" >&5 $as_echo "$ac_cv_have_decl_fread_unlocked" >&6; } if test "x$ac_cv_have_decl_fread_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FREAD_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FREAD_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether fwrite_unlocked is declared" >&5 $as_echo_n "checking whether fwrite_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_fwrite_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef fwrite_unlocked (void) fwrite_unlocked; #endif ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_fwrite_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_fwrite_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_fwrite_unlocked" >&5 $as_echo "$ac_cv_have_decl_fwrite_unlocked" >&6; } if test "x$ac_cv_have_decl_fwrite_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FWRITE_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FWRITE_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether getc_unlocked is declared" >&5 $as_echo_n "checking whether getc_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_getc_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef getc_unlocked (void) getc_unlocked; #endif ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_getc_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_getc_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_getc_unlocked" >&5 $as_echo "$ac_cv_have_decl_getc_unlocked" >&6; } if test "x$ac_cv_have_decl_getc_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETC_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETC_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether getchar_unlocked is declared" >&5 $as_echo_n "checking whether getchar_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_getchar_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef getchar_unlocked (void) getchar_unlocked; #endif ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_getchar_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_getchar_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_getchar_unlocked" >&5 $as_echo "$ac_cv_have_decl_getchar_unlocked" >&6; } if test "x$ac_cv_have_decl_getchar_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETCHAR_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETCHAR_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether putc_unlocked is declared" >&5 $as_echo_n "checking whether putc_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_putc_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef putc_unlocked (void) putc_unlocked; #endif ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_putc_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_putc_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_putc_unlocked" >&5 $as_echo "$ac_cv_have_decl_putc_unlocked" >&6; } if test "x$ac_cv_have_decl_putc_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PUTC_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PUTC_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether putchar_unlocked is declared" >&5 $as_echo_n "checking whether putchar_unlocked is declared... " >&6; } if test "${ac_cv_have_decl_putchar_unlocked+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef putchar_unlocked (void) putchar_unlocked; #endif ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_putchar_unlocked=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_putchar_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_putchar_unlocked" >&5 $as_echo "$ac_cv_have_decl_putchar_unlocked" >&6; } if test "x$ac_cv_have_decl_putchar_unlocked" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PUTCHAR_UNLOCKED 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PUTCHAR_UNLOCKED 0 _ACEOF fi { $as_echo "$as_me:$LINENO: checking whether strerror is declared" >&5 $as_echo_n "checking whether strerror is declared... " >&6; } if test "${ac_cv_have_decl_strerror+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { #ifndef strerror (void) strerror; #endif ; return 0; } _ACEOF 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:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_strerror=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_strerror=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_strerror" >&5 $as_echo "$ac_cv_have_decl_strerror" >&6; } if test "x$ac_cv_have_decl_strerror" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRERROR 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRERROR 0 _ACEOF fi if test "x$enable_gmp" = "xno"; then CPPFLAGS="$CPPFLAGS -DDISABLE_GMP " fi if test "x$enable_nls" = "xyes"; then CPPFLAGS="$CPPFLAGS -DENABLE_NLS " fi if test "x$enable_debug" = "xyes"; then CFLAGS="$CFLAGS $DBGFLAGS " fi if test "x$enable_optimization" = "xyes"; then CFLAGS="$CFLAGS $OPTFLAGS " fi { $as_echo "$as_me:$LINENO: result: Configuration terminated with success:" >&5 $as_echo "Configuration terminated with success:" >&6; } { $as_echo "$as_me:$LINENO: result: Preprocessor flags = \"$CPPFLAGS\"" >&5 $as_echo "Preprocessor flags = \"$CPPFLAGS\"" >&6; } { $as_echo "$as_me:$LINENO: result: Compiler flags = \"$CFLAGS\"" >&5 $as_echo "Compiler flags = \"$CFLAGS\"" >&6; } { $as_echo "$as_me:$LINENO: result: Linker flags = \"$LDFLAGS\"" >&5 $as_echo "Linker flags = \"$LDFLAGS\"" >&6; } { $as_echo "$as_me:$LINENO: result: Libraries = \"$LIBS\"" >&5 $as_echo "Libraries = \"$LIBS\"" >&6; } { $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(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:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi ac_config_files="$ac_config_files Makefile" 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:$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= ;; #( *) $as_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 test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { $as_echo "$as_me:$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= 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. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$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:$LINENO: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF || ac_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} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_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 # PATH needs CR # 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_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 if (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 # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # Required to use basename. 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 # Name of the executable. 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'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. 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 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' 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=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # 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 # 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 Numdiff $as_me 5.8, which was generated by GNU Autoconf 2.63. 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 from templates according to the current configuration. Usage: $0 [OPTION]... [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, 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_version="\\ Numdiff config.status 5.8 configured by $0, generated by GNU Autoconf 2.63, with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2008 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' 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=$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 ;; --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"` ;; esac CONFIG_FILES="$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 CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header { $as_echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; };; --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_echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$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 "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 $as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; 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= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { $as_echo "$as_me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # 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=' ' ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } 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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } 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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\).*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\).*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 $as_echo "$as_me: error: could not setup config files machinery" >&2;} { (exit 1); exit 1; }; } _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_t=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_t"; then break elif $ac_last_try; then { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 $as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} { (exit 1); exit 1; }; } 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_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 $as_echo "$as_me: error: could not setup config headers machinery" >&2;} { (exit 1); exit 1; }; } 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_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 $as_echo "$as_me: error: invalid tag $ac_tag" >&2;} { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 $as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac ac_file_inputs="$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:$LINENO: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } ;; 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" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 $as_echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } 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 # _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:$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 $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 $as_echo "$as_me: error: could not create -" >&2;} { (exit 1); exit 1; }; } fi ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 $as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } # 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 || { (exit 1); exit 1; } fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi numdiff-5.9.0/xmalloc.c0000644000175000017500000000646213054341114014310 0ustar paologpaolog/* xmalloc.c -- malloc with out of memory checking Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #if ! HAVE_INLINE # define static_inline #endif #include "xalloc.h" #undef static_inline #include #include #ifndef SIZE_MAX # define SIZE_MAX ((size_t) -1) #endif /* 1 if calloc is known to be compatible with GNU calloc. This matters if we are not also using the calloc module, which defines HAVE_CALLOC and supports the GNU API even on non-GNU platforms. */ #if defined HAVE_CALLOC || defined __GLIBC__ enum { HAVE_GNU_CALLOC = 1 }; #else enum { HAVE_GNU_CALLOC = 0 }; #endif /* Allocate N bytes of memory dynamically, with error checking. */ void * xmalloc (size_t n) { void *p = malloc (n); if (!p && n != 0) xalloc_die (); return p; } /* Change the size of an allocated block of memory P to N bytes, with error checking. */ void * xrealloc (void *p, size_t n) { p = realloc (p, n); if (!p && n != 0) xalloc_die (); return p; } /* If P is null, allocate a block of at least *PN bytes; otherwise, reallocate P so that it contains more than *PN bytes. *PN must be nonzero unless P is null. Set *PN to the new block's size, and return the pointer to the new block. *PN is never set to zero, and the returned pointer is never null. */ void * x2realloc (void *p, size_t *pn) { return x2nrealloc (p, pn, 1); } /* Allocate S bytes of zeroed memory dynamically, with error checking. There's no need for xnzalloc (N, S), since it would be equivalent to xcalloc (N, S). */ void * xzalloc (size_t s) { return memset (xmalloc (s), 0, s); } /* Allocate zeroed memory for N elements of S bytes, with error checking. S must be nonzero. */ void * xcalloc (size_t n, size_t s) { void *p; /* Test for overflow, since some calloc implementations don't have proper overflow checks. But omit overflow and size-zero tests if HAVE_GNU_CALLOC, since GNU calloc catches overflow and never returns NULL if successful. */ if ((! HAVE_GNU_CALLOC && xalloc_oversized (n, s)) || (! (p = calloc (n, s)) && (HAVE_GNU_CALLOC || n != 0))) xalloc_die (); return p; } /* Clone an object P of size S, with error checking. There's no need for xnmemdup (P, N, S), since xmemdup (P, N * S) works without any need for an arithmetic overflow check. */ void * xmemdup (void const *p, size_t s) { return memcpy (xmalloc (s), p, s); } /* Clone STRING. */ char * xstrdup (char const *string) { return xmemdup (string, strlen (string) + 1); } numdiff-5.9.0/gettext.h0000644000175000017500000000653513054341114014343 0ustar paologpaolog/* Convenience header for conditional use of GNU . Copyright (C) 1995-1998, 2000-2002, 2004 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _LIBGETTEXT_H #define _LIBGETTEXT_H 1 /* NLS can be disabled through the configure --disable-nls option. */ #if ENABLE_NLS /* Get declarations of GNU message catalog functions. */ # include #else /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. We don't include as well because people using "gettext.h" will not include , and also including would fail on SunOS 4, whereas is OK. */ #if defined(__sun) # include #endif /* Many header files from the libstdc++ coming with g++ 3.3 or newer include , which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. */ #if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) # include # if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H # include # endif #endif /* Disabled NLS. The casts to 'const char *' serve the purpose of producing warnings for invalid uses of the value returned from these functions. On pre-ANSI systems without 'const', the config.h file is supposed to contain "#define const". */ # define gettext(Msgid) ((const char *) (Msgid)) # define dgettext(Domainname, Msgid) ((const char *) (Msgid)) # define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define dngettext(Domainname, Msgid1, Msgid2, N) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define textdomain(Domainname) ((const char *) (Domainname)) # define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) # define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) #endif /* A pseudo function call that serves as a marker for the automated extraction of messages, but does not call gettext(). The run-time translation is done at a different place in the code. The argument, String, should be a literal string. Concatenated strings and other string expressions won't work. The macro's expansion is not parenthesized, so that it is suitable as initializer for static 'char[]' or 'const char[]' variables. */ #define gettext_noop(String) String #endif /* _LIBGETTEXT_H */ numdiff-5.9.0/errors.c0000444000175000017500000000452513054341114014161 0ustar paologpaolog/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include "number.h" #ifndef STDC_HEADERS #define VARARGS 1 #else #undef VARARGS #endif #ifndef VARARGS #include #else #include #endif /* Other things for number.c. */ /* int std_only; */ void out_of_memory() { fprintf (stderr, _("%s: insufficient memory for new allocation,\nthe execution of the program ends now\n"), PACKAGE); exit (EXIT_TROUBLE); } /* Runtime error will print a message and stop the machine. */ #ifndef VARARGS #ifdef __STDC__ void rt_error (char *mesg, ...) #else void rt_error (mesg) char *mesg; #endif #else void rt_error (mesg, va_alist) char *mesg; #endif { va_list args; char error_mesg [255]; #ifndef VARARGS va_start (args, mesg); #else va_start (args); #endif vsprintf (error_mesg, mesg, args); va_end (args); fprintf (stderr, _("Runtime error: %s\n"), error_mesg); exit (EXIT_TROUBLE); } /* A runtime warning tells of some action taken by the processor that may change the program execution but was not enough of a problem to stop the execution. */ #ifndef VARARGS #ifdef __STDC__ void rt_warn (char *mesg, ...) #else void rt_warn (mesg) char *mesg; #endif #else void rt_warn (mesg, va_alist) char *mesg; #endif { va_list args; char error_mesg [255]; #ifndef VARARGS va_start (args, mesg); #else va_start (args); #endif vsprintf (error_mesg, mesg, args); va_end (args); fprintf (stderr, _("Runtime warning: %s\n"), error_mesg); } numdiff-5.9.0/po/0000755000175000017500000000000013054341114013113 5ustar paologpaolognumdiff-5.9.0/po/ndselect/0000755000175000017500000000000013054341114014714 5ustar paologpaolognumdiff-5.9.0/po/ndselect/it.po0000644000175000017500000002173613054341114015701 0ustar paologpaolog# Italian messages for ndselect # Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi # This file is distributed under the same license as the Numdiff program. # Ivano Primi , 2017. # msgid "" msgstr "" "Project-Id-Version: numdiff 5.9.0 (ndselect 5.9.0)\n" "Report-Msgid-Bugs-To: ivprimi@libero.it\n" "POT-Creation-Date: 2017-02-12 22:11+0100\n" "PO-Revision-Date: 2016-12-30 22:48+0100\n" "Last-Translator: Ivano Primi \n" "Language-Team: ITALIAN \n" "Language: Italian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1 ? 1 : 0;\n" #: getopt.c:551 getopt.c:570 #, c-format msgid "%s: option `%s' is ambiguous\n" msgstr "%s: l'opzione `%s' è ambigua\n" #: getopt.c:603 getopt.c:607 #, c-format msgid "%s: option `--%s' doesn't allow an argument\n" msgstr "%s: l'opzione `--%s' non vuole argomenti\n" #: getopt.c:616 getopt.c:621 #, c-format msgid "%s: option `%c%s' doesn't allow an argument\n" msgstr "%s: l'opzione `%c%s' non vuole argomenti\n" #: getopt.c:667 getopt.c:689 getopt.c:1020 getopt.c:1042 #, c-format msgid "%s: option `%s' requires an argument\n" msgstr "%s: l'opzione `%s' ha bisogno di un argomento\n" #: getopt.c:727 getopt.c:730 #, c-format msgid "%s: unrecognized option `--%s'\n" msgstr "%s: l'opzione `--%s' risulta sconosciuta\n" #: getopt.c:738 getopt.c:741 #, c-format msgid "%s: unrecognized option `%c%s'\n" msgstr "%s: l'opzione `%c%s' risulta sconosciuta\n" #: getopt.c:796 getopt.c:799 #, c-format msgid "%s: illegal option -- %c\n" msgstr "%s: opzione inammissibile -- %c\n" #: getopt.c:805 getopt.c:808 #, c-format msgid "%s: invalid option -- %c\n" msgstr "%s: opzione non valida -- %c\n" #: getopt.c:863 getopt.c:882 getopt.c:1095 getopt.c:1116 #, c-format msgid "%s: option requires an argument -- %c\n" msgstr "%s: opzione con argomento obbligatorio -- %c\n" #: getopt.c:935 getopt.c:954 #, c-format msgid "%s: option `-W %s' is ambiguous\n" msgstr "%s: l'opzione `-W %s' è ambigua\n" #: getopt.c:978 getopt.c:999 #, c-format msgid "%s: option `-W %s' doesn't allow an argument\n" msgstr "%s: l'opzione `-W %s' non vuole argomenti\n" #: ndselect.c:168 msgid "Ivano Primi" msgstr "Ivano Primi" #: ndselect.c:169 #, c-format msgid "" "License GPLv3+: GNU GPL version 3 or later,\n" "see .\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Licenza GPLv3+: GNU GPL versione 3 o successiva,\n" "vedi .\n" "Questo è software libero: sei libero di modificarlo e redistribuirlo.\n" "NON viene data NESSUNA GARANZIA, nella misura consentita dalle leggi " "vigenti.\n" #: ndselect.c:179 msgid "Usage:" msgstr "Uso:" #: ndselect.c:180 msgid "or" msgstr "oppure" #: ndselect.c:183 #, c-format msgid "" "\n" "Print to standard output a subset of lines and fields from a given file.\n" msgstr "" "\n" "Stampa sullo standard output (schermo) un sottinsieme\n" "di linee e campi di un file dato.\n" #: ndselect.c:185 msgid "The argument after the options is the name of the file to read from." msgstr "L'argomento dopo le opzioni è il nome del file da cui leggere." #: ndselect.c:186 msgid "" "The complete path of the file should be given,\n" "a directory name is not accepted." msgstr "" "È bene fornire il percorso completo del file,\n" "un nome di cartella non viene accettato." #: ndselect.c:187 msgid "" "If no input file is specified, the program reads from the standard input." msgstr "" "Se non si specifica il file da leggere, il programma prende i dati\n" "dallo standard input." #: ndselect.c:188 msgid "Exit status: 0 in case of normal termination, -1 (255) in case of error" msgstr "" "Codice di uscita: 0 in caso di conclusione regolare, -1 (255) su errore" #: ndselect.c:190 msgid "Set to N the number of the first line to print" msgstr "Imposta al valore N il numero della prima linea da stampare" #: ndselect.c:191 msgid "(The default behavior is to start with line number 1)" msgstr "(l'azione predefinita è di stampare dalla linea numero 1)" #: ndselect.c:193 msgid "Set to N the number of the last line that can be printed" msgstr "Imposta al valore N il numero dell'ultima linea stampabile" #: ndselect.c:194 msgid "(The default behavior is to arrive till to the end of the file)" msgstr "(l'azione predefinita è di arrivare fino alla fine del file)" #: ndselect.c:196 msgid "Set to N the increment to use when selecting the lines to print" msgstr "Imposta al valore N il passo con cui selezionare le linee da stampare" #: ndselect.c:197 ndselect.c:206 msgid "(The default value for the increment is 1)" msgstr "(il valore predefinito per il passo è 1)" #: ndselect.c:199 msgid "Set to N the number of the first field to print" msgstr "Imposta al valore N il numero del primo campo da stampare" #: ndselect.c:200 msgid "(The default behavior is to start with field number 1)" msgstr "(l'azione predefinita è di stampare dal campo numero 1)" #: ndselect.c:202 msgid "Set to N the number of the last field that can be printed" msgstr "Imposta al valore N il numero dell'ultimo campo stampabile" #: ndselect.c:203 msgid "(The default behavior is to arrive till to the end of every line)" msgstr "(l'azione predefinita è di arrivare fino alla fine di ogni linea)" #: ndselect.c:205 msgid "Set to N the increment to use when selecting the fields to print" msgstr "Imposta al valore N il passo con cui selezionare i campi da stampare" #: ndselect.c:208 msgid "" "Specify the set of characters to use as delimiters\n" " while splitting the input lines into fields" msgstr "" "Specifica l'insieme dei caratteri da usare come separatori\n" " al momento di suddividere le linee di input in campi" #: ndselect.c:209 ndselect.c:212 msgid "(The default set of delimiters is space, tab and newline)" msgstr "(l'insieme predefinito è spazio bianco, tabulazione e nuova linea)" #: ndselect.c:211 msgid "" "Specify the set of strings to use as delimiters\n" " while splitting the input lines into fields" msgstr "" "Specifica l'insieme delle stringhe da usare come separatori\n" " al momento di suddividere le linee di input in campi" #: ndselect.c:214 msgid "" "Specify the string to use as separator\n" " while writing the selected fields to the standard output" msgstr "" "Specifica la stringa da usare come separatore al momento\n" " di scrivere i campi selezionati sullo standard output (schermo)" #: ndselect.c:215 msgid "" "(The default behavior consists in reusing\n" " the delimiters found in the input lines)" msgstr "" "(l'azione predefinita consiste nel riutilizzare\n" " i separatori trovati nelle linee di input)" #: ndselect.c:217 msgid "Do not print empty lines" msgstr "Non stampare linee vuote" #: ndselect.c:219 msgid "Redirect warning and error messages from stderr to the indicated file" msgstr "" "Reindirizza avvertimenti e messaggi di errore\n" " dallo standard error (schermo) al file indicato" #: ndselect.c:221 msgid "Redirect output from stdout to the indicated file" msgstr "Reindirizza l'output dallo standard output (schermo) al file indicato" #: ndselect.c:222 msgid "Show this help message" msgstr "Mostra questo messaggio di aiuto" #: ndselect.c:223 msgid "Show version number, Copyright, Distribution Terms and NO-Warranty" msgstr "" "Mostra numero di versione, Copyright,\n" " termini di distribuzione e NON-Garanzia" #: ndselect.c:287 ndselect.c:301 ndselect.c:315 ndselect.c:329 ndselect.c:343 #: ndselect.c:357 #, c-format msgid "%s: invalid argument after `-%c' option\n" msgstr "%s: un argomento non valido segue l'opzione `-%c'\n" #: ndselect.c:371 ndselect.c:397 ndselect.c:423 ndselect.c:494 #, c-format msgid "%s: memory exhausted\n" msgstr "%s: memoria esaurita\n" #: ndselect.c:376 ndselect.c:402 #, c-format msgid "%s: invalid argument after `-%c' option:\n" msgstr "%s: un argomento non valido segue l'opzione `-%c':\n" #: ndselect.c:378 #, c-format msgid "" " The list of field delimiters cannot be empty and\n" " must always include the newline character ('\\n')\n" msgstr "" " La lista di separatori di campo non può essere vuota\n" " e deve sempre includere il carattere di nuova linea ('\\n')\n" #: ndselect.c:404 #, c-format msgid "" " The list of field delimiters cannot be empty and\n" " must always include the newline string (\"\\n\")\n" msgstr "" " La lista di separatori di campo non può essere vuota\n" " e deve sempre includere la stringa di nuova linea (\"\\n\")\n" #: ndselect.c:435 ndselect.c:445 ndselect.c:520 #, c-format msgid "%s: cannot open file \"%s\":\n" msgstr "%s: impossibile aprire il file \"%s\":\n" #: ndselect.c:524 #, c-format msgid "%s: cannot close file \"%s\":\n" msgstr "%s: è stato impossibile chiudere il file \"%s\":\n" #: ndselect.c:528 #, c-format msgid "" "%s: Error occurred while reading from file \"%s\"\n" "\n" msgstr "" "%s: Errore di lettura dal file \"%s\"\n" "\n" numdiff-5.9.0/po/ndselect/ndselect.pot0000644000175000017500000001333513054341114017246 0ustar paologpaolog# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: ndselect 5.9.0\n" "Report-Msgid-Bugs-To: ivprimi@libero.it\n" "POT-Creation-Date: 2017-02-12 22:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: getopt.c:551 getopt.c:570 #, c-format msgid "%s: option `%s' is ambiguous\n" msgstr "" #: getopt.c:603 getopt.c:607 #, c-format msgid "%s: option `--%s' doesn't allow an argument\n" msgstr "" #: getopt.c:616 getopt.c:621 #, c-format msgid "%s: option `%c%s' doesn't allow an argument\n" msgstr "" #: getopt.c:667 getopt.c:689 getopt.c:1020 getopt.c:1042 #, c-format msgid "%s: option `%s' requires an argument\n" msgstr "" #: getopt.c:727 getopt.c:730 #, c-format msgid "%s: unrecognized option `--%s'\n" msgstr "" #: getopt.c:738 getopt.c:741 #, c-format msgid "%s: unrecognized option `%c%s'\n" msgstr "" #: getopt.c:796 getopt.c:799 #, c-format msgid "%s: illegal option -- %c\n" msgstr "" #: getopt.c:805 getopt.c:808 #, c-format msgid "%s: invalid option -- %c\n" msgstr "" #: getopt.c:863 getopt.c:882 getopt.c:1095 getopt.c:1116 #, c-format msgid "%s: option requires an argument -- %c\n" msgstr "" #: getopt.c:935 getopt.c:954 #, c-format msgid "%s: option `-W %s' is ambiguous\n" msgstr "" #: getopt.c:978 getopt.c:999 #, c-format msgid "%s: option `-W %s' doesn't allow an argument\n" msgstr "" #: ndselect.c:168 msgid "Ivano Primi" msgstr "" #: ndselect.c:169 #, c-format msgid "" "License GPLv3+: GNU GPL version 3 or later,\n" "see .\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" #: ndselect.c:179 msgid "Usage:" msgstr "" #: ndselect.c:180 msgid "or" msgstr "" #: ndselect.c:183 #, c-format msgid "" "\n" "Print to standard output a subset of lines and fields from a given file.\n" msgstr "" #: ndselect.c:185 msgid "The argument after the options is the name of the file to read from." msgstr "" #: ndselect.c:186 msgid "" "The complete path of the file should be given,\n" "a directory name is not accepted." msgstr "" #: ndselect.c:187 msgid "" "If no input file is specified, the program reads from the standard input." msgstr "" #: ndselect.c:188 msgid "Exit status: 0 in case of normal termination, -1 (255) in case of error" msgstr "" #: ndselect.c:190 msgid "Set to N the number of the first line to print" msgstr "" #: ndselect.c:191 msgid "(The default behavior is to start with line number 1)" msgstr "" #: ndselect.c:193 msgid "Set to N the number of the last line that can be printed" msgstr "" #: ndselect.c:194 msgid "(The default behavior is to arrive till to the end of the file)" msgstr "" #: ndselect.c:196 msgid "Set to N the increment to use when selecting the lines to print" msgstr "" #: ndselect.c:197 ndselect.c:206 msgid "(The default value for the increment is 1)" msgstr "" #: ndselect.c:199 msgid "Set to N the number of the first field to print" msgstr "" #: ndselect.c:200 msgid "(The default behavior is to start with field number 1)" msgstr "" #: ndselect.c:202 msgid "Set to N the number of the last field that can be printed" msgstr "" #: ndselect.c:203 msgid "(The default behavior is to arrive till to the end of every line)" msgstr "" #: ndselect.c:205 msgid "Set to N the increment to use when selecting the fields to print" msgstr "" #: ndselect.c:208 msgid "" "Specify the set of characters to use as delimiters\n" " while splitting the input lines into fields" msgstr "" #: ndselect.c:209 ndselect.c:212 msgid "(The default set of delimiters is space, tab and newline)" msgstr "" #: ndselect.c:211 msgid "" "Specify the set of strings to use as delimiters\n" " while splitting the input lines into fields" msgstr "" #: ndselect.c:214 msgid "" "Specify the string to use as separator\n" " while writing the selected fields to the standard output" msgstr "" #: ndselect.c:215 msgid "" "(The default behavior consists in reusing\n" " the delimiters found in the input lines)" msgstr "" #: ndselect.c:217 msgid "Do not print empty lines" msgstr "" #: ndselect.c:219 msgid "Redirect warning and error messages from stderr to the indicated file" msgstr "" #: ndselect.c:221 msgid "Redirect output from stdout to the indicated file" msgstr "" #: ndselect.c:222 msgid "Show this help message" msgstr "" #: ndselect.c:223 msgid "Show version number, Copyright, Distribution Terms and NO-Warranty" msgstr "" #: ndselect.c:287 ndselect.c:301 ndselect.c:315 ndselect.c:329 ndselect.c:343 #: ndselect.c:357 #, c-format msgid "%s: invalid argument after `-%c' option\n" msgstr "" #: ndselect.c:371 ndselect.c:397 ndselect.c:423 ndselect.c:494 #, c-format msgid "%s: memory exhausted\n" msgstr "" #: ndselect.c:376 ndselect.c:402 #, c-format msgid "%s: invalid argument after `-%c' option:\n" msgstr "" #: ndselect.c:378 #, c-format msgid "" " The list of field delimiters cannot be empty and\n" " must always include the newline character ('\\n')\n" msgstr "" #: ndselect.c:404 #, c-format msgid "" " The list of field delimiters cannot be empty and\n" " must always include the newline string (\"\\n\")\n" msgstr "" #: ndselect.c:435 ndselect.c:445 ndselect.c:520 #, c-format msgid "%s: cannot open file \"%s\":\n" msgstr "" #: ndselect.c:524 #, c-format msgid "%s: cannot close file \"%s\":\n" msgstr "" #: ndselect.c:528 #, c-format msgid "" "%s: Error occurred while reading from file \"%s\"\n" "\n" msgstr "" numdiff-5.9.0/po/ndselect/it.mo0000644000175000017500000001620313054341114015667 0ustar paologpaologÞ•2¬C<HJIf”cû1_‘®Ê(ä) 7Q,g”%²,Ø- 3&T{›W»A?U6•5Ì9 *< g G€ IÈ  Í 1ì E @d ?¥ /å . 9D 8~ · BÎ b _t cÔ D8P}ÎÕ¥ØY~uØsN%Â0è% ?2`3“Çå)û%.D)s*!È-ê))B_lBÌ=8M:†CÁ)/GHX éïõFåb,DEÔ9;T::Ë Q'sytí|b?ßWw|)#$/!% (0 ,"2+.* 1 &- ' Print to standard output a subset of lines and fields from a given file. The list of field delimiters cannot be empty and must always include the newline character ('\n') The list of field delimiters cannot be empty and must always include the newline string ("\n") %s: Error occurred while reading from file "%s" %s: cannot close file "%s": %s: cannot open file "%s": %s: illegal option -- %c %s: invalid argument after `-%c' option %s: invalid argument after `-%c' option: %s: invalid option -- %c %s: memory exhausted %s: option `%c%s' doesn't allow an argument %s: option `%s' is ambiguous %s: option `%s' requires an argument %s: option `--%s' doesn't allow an argument %s: option `-W %s' doesn't allow an argument %s: option `-W %s' is ambiguous %s: option requires an argument -- %c %s: unrecognized option `%c%s' %s: unrecognized option `--%s' (The default behavior consists in reusing the delimiters found in the input lines)(The default behavior is to arrive till to the end of every line)(The default behavior is to arrive till to the end of the file)(The default behavior is to start with field number 1)(The default behavior is to start with line number 1)(The default set of delimiters is space, tab and newline)(The default value for the increment is 1)Do not print empty linesExit status: 0 in case of normal termination, -1 (255) in case of errorIf no input file is specified, the program reads from the standard input.Ivano PrimiLicense GPLv3+: GNU GPL version 3 or later, see . This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Redirect output from stdout to the indicated fileRedirect warning and error messages from stderr to the indicated fileSet to N the increment to use when selecting the fields to printSet to N the increment to use when selecting the lines to printSet to N the number of the first field to printSet to N the number of the first line to printSet to N the number of the last field that can be printedSet to N the number of the last line that can be printedShow this help messageShow version number, Copyright, Distribution Terms and NO-WarrantySpecify the set of characters to use as delimiters while splitting the input lines into fieldsSpecify the set of strings to use as delimiters while splitting the input lines into fieldsSpecify the string to use as separator while writing the selected fields to the standard outputThe argument after the options is the name of the file to read from.The complete path of the file should be given, a directory name is not accepted.Usage:orProject-Id-Version: numdiff 5.9.0 (ndselect 5.9.0) Report-Msgid-Bugs-To: ivprimi@libero.it POT-Creation-Date: 2017-02-12 22:11+0100 PO-Revision-Date: 2016-12-30 22:48+0100 Last-Translator: Ivano Primi Language-Team: ITALIAN Language: Italian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1 ? 1 : 0; Stampa sullo standard output (schermo) un sottinsieme di linee e campi di un file dato. La lista di separatori di campo non può essere vuota e deve sempre includere il carattere di nuova linea ('\n') La lista di separatori di campo non può essere vuota e deve sempre includere la stringa di nuova linea ("\n") %s: Errore di lettura dal file "%s" %s: è stato impossibile chiudere il file "%s": %s: impossibile aprire il file "%s": %s: opzione inammissibile -- %c %s: un argomento non valido segue l'opzione `-%c' %s: un argomento non valido segue l'opzione `-%c': %s: opzione non valida -- %c %s: memoria esaurita %s: l'opzione `%c%s' non vuole argomenti %s: l'opzione `%s' è ambigua %s: l'opzione `%s' ha bisogno di un argomento %s: l'opzione `--%s' non vuole argomenti %s: l'opzione `-W %s' non vuole argomenti %s: l'opzione `-W %s' è ambigua %s: opzione con argomento obbligatorio -- %c %s: l'opzione `%c%s' risulta sconosciuta %s: l'opzione `--%s' risulta sconosciuta (l'azione predefinita consiste nel riutilizzare i separatori trovati nelle linee di input)(l'azione predefinita è di arrivare fino alla fine di ogni linea)(l'azione predefinita è di arrivare fino alla fine del file)(l'azione predefinita è di stampare dal campo numero 1)(l'azione predefinita è di stampare dalla linea numero 1)(l'insieme predefinito è spazio bianco, tabulazione e nuova linea)(il valore predefinito per il passo è 1)Non stampare linee vuoteCodice di uscita: 0 in caso di conclusione regolare, -1 (255) su erroreSe non si specifica il file da leggere, il programma prende i dati dallo standard input.Ivano PrimiLicenza GPLv3+: GNU GPL versione 3 o successiva, vedi . Questo è software libero: sei libero di modificarlo e redistribuirlo. NON viene data NESSUNA GARANZIA, nella misura consentita dalle leggi vigenti. Reindirizza l'output dallo standard output (schermo) al file indicatoReindirizza avvertimenti e messaggi di errore dallo standard error (schermo) al file indicatoImposta al valore N il passo con cui selezionare i campi da stampareImposta al valore N il passo con cui selezionare le linee da stampareImposta al valore N il numero del primo campo da stampareImposta al valore N il numero della prima linea da stampareImposta al valore N il numero dell'ultimo campo stampabileImposta al valore N il numero dell'ultima linea stampabileMostra questo messaggio di aiutoMostra numero di versione, Copyright, termini di distribuzione e NON-GaranziaSpecifica l'insieme dei caratteri da usare come separatori al momento di suddividere le linee di input in campiSpecifica l'insieme delle stringhe da usare come separatori al momento di suddividere le linee di input in campiSpecifica la stringa da usare come separatore al momento di scrivere i campi selezionati sullo standard output (schermo)L'argomento dopo le opzioni è il nome del file da cui leggere.È bene fornire il percorso completo del file, un nome di cartella non viene accettato.Uso:oppurenumdiff-5.9.0/po/numdiff/0000755000175000017500000000000013054341114014543 5ustar paologpaolognumdiff-5.9.0/po/numdiff/it.po0000644000175000017500000010410713054341114015522 0ustar paologpaolog# Italian messages for numdiff # Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi # This file is distributed under the same license as the Numdiff program. # Ivano Primi , 2017. # msgid "" msgstr "" "Project-Id-Version: numdiff 5.9.0\n" "Report-Msgid-Bugs-To: ivprimi@libero.it\n" "POT-Creation-Date: 2017-02-12 22:11+0100\n" "PO-Revision-Date: 2017-01-01 17:16+0100\n" "Last-Translator: Ivano Primi \n" "Language-Team: ITALIAN \n" "Language: Italian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1 ? 1 : 0;\n" #: cmpfns.c:293 cmpfns.c:309 cmpfns.c:403 cmpfns.c:419 #, c-format msgid "" "@ Line %lu in file \"%s\"\n" " contains too many fields to be properly processed!\n" msgstr "" "@ La linea %lu nel file \"%s\"\n" " contiene troppi campi per essere elaborata correttamente!\n" #: cmpfns.c:435 cmpfns.c:455 #, c-format msgid "@ Line %lu in file \"%s\" is shorter than expected!\n" msgstr "@ La linea %lu nel file \"%s\" è più corta del previsto\n" #: cmpfns.c:596 cmpfns.c:621 cmpfns.c:654 cmpfns.c:673 #, c-format msgid "" "\n" "*** File \"%s\" is binary,\n" "*** cannot read from it\n" msgstr "" "\n" "*** Il file \"%s\" è un file binario,\n" "*** non è possibile leggere dati da esso\n" #: cmpfns.c:599 cmpfns.c:624 cmpfns.c:657 cmpfns.c:678 #, c-format msgid "" "\n" "*** Error while reading from file \"%s\"\n" msgstr "" "\n" "*** Errore in lettura dal file \"%s\"\n" #: cmpfns.c:602 cmpfns.c:627 cmpfns.c:660 cmpfns.c:683 #, c-format msgid "" "\n" "*** Out of memory while reading from file \"%s\"\n" msgstr "" "\n" "*** Esaurimento di memoria durante la lettura del file \"%s\"\n" #: cmpfns.c:609 cmpfns.c:632 cmpfns.c:639 cmpfns.c:664 #, c-format msgid "" "\n" "*** End of file \"%s\" reached while trying to read line %lu.\n" msgstr "" "\n" "*** Raggiunta la fine del file \"%s\"\n" "*** mentre si cercava di leggere la linea %lu.\n" #: cmpfns.c:610 cmpfns.c:633 cmpfns.c:640 cmpfns.c:665 #, c-format msgid "*** File \"%s\" has more lines than file \"%s\",\n" msgstr "*** Il file \"%s\" ha più linee del file \"%s\",\n" #: cmpfns.c:612 cmpfns.c:635 cmpfns.c:642 cmpfns.c:667 #, c-format msgid "" "*** line %lu is the last one read from file \"%s\"\n" "\n" msgstr "" "*** la linea %lu è l'ultima letta dal file \"%s\"\n" "\n" #: error.c:125 msgid "Unknown system error" msgstr "Errore di sistema sconosciuto" #: errors.c:43 #, c-format msgid "" "%s: insufficient memory for new allocation,\n" "the execution of the program ends now\n" msgstr "" "%s: memoria insufficiente per nuova assegnazione,\n" "l'esecuzione del programma finisce qui\n" #: errors.c:76 #, c-format msgid "Runtime error: %s\n" msgstr "Errore durante l'esecuzione del programma: %s\n" #: errors.c:110 #, c-format msgid "Runtime warning: %s\n" msgstr "" "Avvertimento lanciato durante l'esecuzione del programma:\n" "%s\n" #: flags.c:58 msgid "\n" msgstr "\n" #: getopt.c:551 getopt.c:570 #, c-format msgid "%s: option `%s' is ambiguous\n" msgstr "%s: l'opzione `%s' è ambigua\n" #: getopt.c:603 getopt.c:607 #, c-format msgid "%s: option `--%s' doesn't allow an argument\n" msgstr "%s: l'opzione `--%s' non vuole argomenti\n" #: getopt.c:616 getopt.c:621 #, c-format msgid "%s: option `%c%s' doesn't allow an argument\n" msgstr "%s: l'opzione `%c%s' non vuole argomenti\n" #: getopt.c:667 getopt.c:689 getopt.c:1020 getopt.c:1042 #, c-format msgid "%s: option `%s' requires an argument\n" msgstr "%s: l'opzione `%s' ha bisogno di un argomento\n" #: getopt.c:727 getopt.c:730 #, c-format msgid "%s: unrecognized option `--%s'\n" msgstr "%s: l'opzione `--%s' risulta sconosciuta\n" #: getopt.c:738 getopt.c:741 #, c-format msgid "%s: unrecognized option `%c%s'\n" msgstr "%s: l'opzione `%c%s' risulta sconosciuta\n" #: getopt.c:796 getopt.c:799 #, c-format msgid "%s: illegal option -- %c\n" msgstr "%s: opzione inammissibile -- %c\n" #: getopt.c:805 getopt.c:808 #, c-format msgid "%s: invalid option -- %c\n" msgstr "%s: opzione non valida -- %c\n" #: getopt.c:863 getopt.c:882 getopt.c:1095 getopt.c:1116 #, c-format msgid "%s: option requires an argument -- %c\n" msgstr "%s: opzione con argomento obbligatorio -- %c\n" #: getopt.c:935 getopt.c:954 #, c-format msgid "%s: option `-W %s' is ambiguous\n" msgstr "%s: l'opzione `-W %s' è ambigua\n" #: getopt.c:978 getopt.c:999 #, c-format msgid "%s: option `-W %s' doesn't allow an argument\n" msgstr "%s: l'opzione `-W %s' non vuole argomenti\n" #: inout.c:348 util.c:121 util.c:136 util.c:242 util.c:258 #, c-format msgid "" "*** Fatal error occurred in function %s:\n" "%s" msgstr "" "*** Errore non emendabile verificatosi durante\n" "*** l'esecuzione della funzione %s:\n" "%s" #: inout.c:350 util.c:123 util.c:138 util.c:244 util.c:260 msgid "" "*** a very long line has been encountered which contains\n" "*** too many fields to be correctly handled\n" msgstr "" "*** È stata incontrata una linea molto lunga che contiene\n" "*** troppi campi per poter essere elaborata correttamente\n" #: io.c:129 msgid "@ Absolute error = " msgstr "@ Errore assoluto = " #: io.c:131 msgid ", Relative error = " msgstr ", Errore relativo = " #: main.c:361 msgid "" "\n" " In the computation of the following quantities\n" " only the errors with positive sign are considered:\n" msgstr "" "\n" " Nel calcolo dei seguenti valori vengono considerati\n" " solo gli errori con segno positivo:\n" #: main.c:363 msgid "" " differences due to numeric fields of the second file that are\n" " less than the corresponding fields in the first file are neglected\n" "\n" msgstr "" " le differenze dovute a campi numerici del secondo file\n" " che risultano essere minori dei corrispondenti campi\n" " del primo file sono state tralasciate\n" "\n" #: main.c:368 msgid "" "\n" " In the computation of the following quantities\n" " only the errors with negative sign are considered:\n" msgstr "" "\n" " Nel calcolo dei seguenti valori vengono considerati\n" " solo gli errori con segno negativo:\n" #: main.c:370 msgid "" " differences due to numeric fields of the second file that are\n" " greater than the corresponding fields in the first file are neglected\n" "\n" msgstr "" " le differenze dovute a campi numerici del secondo file\n" " che risultano essere maggiori dei corrispondenti campi\n" " del primo file sono state tralasciate\n" "\n" #: main.c:376 msgid "" "\n" "No numeric comparison has been done\n" msgstr "" "\n" "Non è stato effettuato alcun confronto numerico\n" #: main.c:380 #, c-format msgid "" "\n" "One numeric comparison has been done and\n" "the resulting numeric difference is negligible\n" msgid_plural "" "\n" "%d numeric comparisons have been done and\n" "the resulting numeric differences are all negligible\n" msgstr[0] "" "\n" "È stato effettuato un solo confronto numerico e\n" "la differenza numerica rilevata è trascurabile\n" msgstr[1] "" "\n" "Sono stati effettuati %d confronti numerici e\n" "le differenze numeriche rilevate sono tutte trascurabili\n" #: main.c:387 #, c-format msgid "" "\n" "One numeric comparison has been done and\n" "has produced an outcome beyond the tolerance threshold\n" msgid_plural "" "\n" "%d numeric comparisons have been done, all of them\n" "have produced an outcome beyond the tolerance threshold\n" msgstr[0] "" "\n" "È stato effettuato un solo confronto numerico e\n" "ha prodotto un risultato oltre la soglia di tolleranza\n" msgstr[1] "" "\n" "Sono stati effettuati %d confronti numerici e tutti\n" "hanno prodotto un risultato oltre la soglia di tolleranza\n" #: main.c:395 #, c-format msgid "" "\n" "One numeric comparison has been done,\n" msgid_plural "" "\n" "%d numeric comparisons have been done,\n" msgstr[0] "" "\n" "È stato effettuato un solo confronto numerico,\n" msgstr[1] "" "\n" "Sono stati effettuati %d confronti numerici,\n" #: main.c:400 #, c-format msgid "" "only one numeric comparison has produced an outcome\n" "beyond the tolerance threshold\n" msgid_plural "" "%d numeric comparisons have produced an outcome\n" "beyond the tolerance threshold\n" msgstr[0] "" "un solo confronto numerico ha prodotto un risultato\n" "oltre la soglia di tolleranza\n" msgstr[1] "" "%d confronti numerici hanno prodotto un risultato\n" "oltre la soglia di tolleranza\n" #: main.c:405 msgid "" "\n" "Largest absolute error in the set of the major numerical differences:\n" msgstr "" "\n" "Massimo errore assoluto nell'insieme delle differenze numeriche rilevanti:\n" #: main.c:408 msgid "" "\n" "Corresponding relative error:\n" msgstr "" "\n" "Corrispondente errore relativo:\n" #: main.c:412 main.c:425 #, c-format msgid "" "\n" "First occurrence (#line, #field) in the first file: %lu, %lu\n" msgstr "" "\n" "Prima posizione di rinvenimento (#linea, #campo) nel primo file: %lu, %lu\n" #: main.c:414 main.c:427 #, c-format msgid "First occurrence (#line, #field) in the second file: %lu, %lu\n" msgstr "" "Prima posizione di rinvenimento (#linea, #campo) nel secondo file: %lu, %lu\n" #: main.c:418 msgid "" "\n" "Largest relative error in the set of the major numerical differences:\n" msgstr "" "\n" "Massimo errore relativo nell'insieme delle differenze numeriche rilevanti:\n" #: main.c:421 msgid "" "\n" "Corresponding absolute error:\n" msgstr "" "\n" "Corrispondente errore assoluto:\n" #: main.c:431 msgid "" "\n" "\n" "Sum of all absolute errors:\n" msgstr "" "\n" "\n" "Somma degli errori assoluti:\n" #: main.c:434 msgid "" "\n" "Sum of the major absolute errors:\n" msgstr "" "\n" "Somma degli errori assoluti non trascurabili:\n" #: main.c:440 msgid "" "\n" "Arithmetic mean of all absolute errors:\n" msgstr "" "\n" "Media aritmetica degli errori assoluti:\n" #: main.c:443 msgid "" "\n" "Arithmetic mean of the major absolute errors:\n" msgstr "" "\n" "Media aritmetica degli errori assoluti non trascurabili:\n" #: main.c:452 msgid "" "\n" "Square root of the sum of the squares of all absolute errors:\n" msgstr "" "\n" "Radice quadrata della somma dei quadrati\n" "di tutti gli errori assoluti:\n" #: main.c:455 msgid "" "\n" "Quadratic mean of all absolute errors:\n" msgstr "" "\n" "Media quadratica degli errori assoluti:\n" #: main.c:463 msgid "" "\n" "Square root of the sum of the squares\n" "of the major absolute errors:\n" msgstr "" "\n" "Radice quadrata della somma dei quadrati\n" "di tutti gli errori assoluti non trascurabili:\n" #: main.c:466 msgid "" "\n" "Quadratic mean of the major absolute errors:\n" msgstr "" "\n" "Media quadratica degli errori assoluti non trascurabili:\n" #: main.c:504 #, c-format msgid "*** %s: memory exhausted\n" msgstr "*** %s: memoria esaurita\n" #: main.c:557 msgid "" "\n" "*** The requested comparison cannot be performed:\n" msgstr "" "\n" "*** Il confronto richiesto non può essere effettuato:\n" #: main.c:558 #, c-format msgid "*** At least one between \"%s\" and \"%s\" is a binary file\n" msgstr "*** Almeno uno tra \"%s\" e \"%s\" è un file binario\n" #: main.c:583 #, c-format msgid "" "\n" "+++ Files \"%s\" and \"%s\" have the same structure\n" msgstr "" "\n" "+++ I file \"%s\" e \"%s\" hanno la stessa struttura\n" #: main.c:586 #, c-format msgid "" "\n" "+++ Files \"%s\" and \"%s\" are equal\n" msgstr "" "\n" "+++ I file \"%s\" e \"%s\" sono uguali\n" #: main.c:590 #, c-format msgid "" "\n" "+++ File \"%s\" differs from file \"%s\"\n" msgstr "" "\n" "+++ Il file \"%s\" differisce dal file \"%s\"\n" #: new.c:151 numutil.c:157 numutil.c:312 #, c-format msgid "" "%s: a number with a too small exponent has been found,\n" "namely \"%s\".\n" msgstr "" "%s: è stato trovato un numero con un esponente troppo basso,\n" "precisamente \"%s\".\n" #: new.c:152 numutil.c:158 numutil.c:313 #, c-format msgid "Exponents smaller than %ld are not accepted,\n" msgstr "Esponenti inferiori a %ld non sono accettati,\n" #: new.c:153 new.c:160 numutil.c:159 numutil.c:166 numutil.c:314 numutil.c:321 #, c-format msgid "the execution of the program ends now\n" msgstr "l'esecuzione del programma finisce qui\n" #: new.c:158 numutil.c:164 numutil.c:319 #, c-format msgid "" "%s: a number with a too large exponent has been found,\n" "namely \"%s\".\n" msgstr "" "%s: è stato trovato un numero con un esponente troppo alto,\n" "precisamente \"%s\".\n" #: new.c:159 numutil.c:165 numutil.c:320 #, c-format msgid "Exponents larger than %ld are not accepted,\n" msgstr "Esponenti superiori a %ld non sono accettati,\n" #: number.c:1228 msgid "power with non integral base" msgstr "potenza con base non intera" #: number.c:1234 number.c:1285 msgid "power with non integral exponent" msgstr "potenza con esponente non intero" #: number.c:1241 msgid "modulus is not an integral value" msgstr "il modulo non è un valore intero" #: number.c:1289 msgid "exponent too large in raise" msgstr "potenza con esponente troppo grande" #: numutil.c:863 #, c-format msgid "" "The string \"%s\"\n" "is not a valid number, the execution of the program ends now\n" msgstr "" "La stringa \"%s\"\n" "non è un numero valido, l'esecuzione del programma finisce qui\n" #: options.c:46 msgid "Ivano Primi" msgstr "Ivano Primi" #: options.c:47 #, c-format msgid "" "License GPLv3+: GNU GPL version 3 or later,\n" "see .\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Licenza GPLv3+: GNU GPL versione 3 o successiva,\n" "vedi .\n" "Questo è software libero: sei libero di modificarlo e redistribuirlo.\n" "NON c'è NESSUNA GARANZIA, per quanto consentito dalle vigenti normative.\n" #: options.c:53 msgid "" "The software has been linked against\n" "the GNU Multiple Precision Arithmetic Library,\n" "version number" msgstr "" "Il software è stato linkato alla libreria\n" "GNU per l'aritmetica a precisione multipla (GNU MP),\n" "numero di versione" #: options.c:57 msgid "" "The software has been built with\n" "its own internal support for multiple precision arithmetic" msgstr "" "Il software è stato compilato attivando\n" "il suo supporto interno per l'aritmetica a precisione multipla" #: options.c:64 msgid "Usage:" msgstr "Uso:" #: options.c:65 msgid "or" msgstr "oppure" #: options.c:67 #, c-format msgid "" "\n" "Compare putatively similar files line by line and field by field,\n" "ignoring small numeric differences or/and different numeric formats.\n" "\n" msgstr "" "\n" "Confronta file grossolanamente simili linea per linea e campo per campo,\n" "ignorando piccole differenze numeriche o/e formati numerici differenti.\n" "\n" #: options.c:68 #, c-format msgid "" "RANGE, RANGE1 and RANGE2 stay for a positive integer value or\n" "for a range of integer values, like 1-, 3-5 or -7.\n" msgstr "" "RANGE, RANGE1 e RANGE2 stanno per un valore intero positivo oppure\n" "per un intervallo di valori interi, per esempio 1-, 3-5 o -7.\n" #: options.c:70 msgid "" "The two arguments after the options are the names of the files to compare." msgstr "I due argomenti dopo le opzioni sono i nomi dei file da confrontare." #: options.c:71 msgid "" "The complete paths of the files should be given,\n" "a directory name is not accepted." msgstr "" "È bene fornire i percorsi completi dei file,\n" "un nome di cartella non viene accettato." #: options.c:72 msgid "" "The given paths cannot refer to the same file\n" "but one of them can be \"-\", which refers to stdin." msgstr "" "I file non possono coincidere ma uno di loro può essere \"-\",\n" "che si riferisce allo standard input." #: options.c:73 msgid "" "Exit status: 1 if files differ, 0 if they are equal, -1 (255) in case of " "error" msgstr "" "Codice di uscita: 1 se i file sono diversi, 0 se uguali, -1 (255) su errore" #: options.c:76 msgid "" "Specify the set of characters to use as delimiters\n" " while splitting the input lines into fields" msgstr "" "Specifica l'insieme dei caratteri da usare come separatori\n" " al momento di suddividere le linee di input in campi" #: options.c:77 options.c:81 msgid "(The default set of delimiters is space, tab and newline)." msgstr "(l'insieme predefinito è spazio bianco, tabulazione e nuova linea)." #: options.c:78 msgid "" "If IFS is prefixed with 1: or 2:, use the given delimiter set\n" " only for the lines from the first or the second file respectively" msgstr "" "Se IFS è preceduto dal prefisso 1: o da 2:, usa l'insieme di\n" " separatori specificato solo per le linee del primo ovvero del secondo " "file" #: options.c:80 msgid "" "Specify the set of strings to use as delimiters\n" " while splitting the input lines into fields" msgstr "" "Specifica l'insieme delle stringhe da usare come separatori\n" " al momento di suddividere le linee di input in campi" #: options.c:82 msgid "" "If DELIMS is prefixed with 1: or 2:, use the given delimiter set\n" " only for the lines from the first or the second file respectively" msgstr "" "Se DELIMS è preceduto dal prefisso 1: o da 2:, usa l'insieme di\n" " separatori specificato solo per le linee del primo ovvero del secondo " "file" #: options.c:84 msgid "" "Set to THRVAL the maximum absolute difference permitted\n" " before two numeric fields are regarded as different\n" " (The default value is zero)." msgstr "" "Imposta al valore THRVAL la massima differenza assoluta consentita\n" " prima che due campi numerici siano considerati diversi\n" " (il valore predefinito è zero)." #: options.c:85 options.c:89 msgid "" "If a RANGE is given, use the specified\n" " threshold only when comparing fields whose positions lie in RANGE." msgstr "" "Se un solo RANGE è dato, usa il valore di soglia specificato\n" " solo per confrontare campi le cui posizioni cadono dentro RANGE." #: options.c:86 options.c:90 msgid "" "If both RANGE1 and RANGE2 are given and have the same length,\n" " then use the specified threshold when comparing a field of FILE1\n" " lying in RANGE1 with the corresponding field of FILE2 in RANGE2" msgstr "" "Se sono dati sia RANGE1 che RANGE2 ed hanno la stessa lunghezza,\n" " usa il valore di soglia specificato solo per confrontare un campo di FILE1\n" " che cade in RANGE1 con il corrispondente campo di FILE2 in RANGE2" #: options.c:88 msgid "" "Set to THRVAL the maximum relative difference permitted\n" " before two numeric fields are regarded as different\n" " (The default value is zero)." msgstr "" "Imposta al valore THRVAL la massima differenza relativa consentita\n" " prima che due campi numerici siano considerati diversi\n" " (il valore predefinito è zero)." #: options.c:92 msgid "" "Consider two numerical values as equal only if\n" " both absolute and relative difference do not exceed\n" " the respective tolerance threshold" msgstr "" "Considera due campi numerici come uguali solo se\n" " la differenza assoluta e quella relativa sono entrambe dentro\n" " la rispettiva soglia di tolleranza" #: options.c:94 msgid "Use the formula indicated by NUM to compute the relative errors." msgstr "Usa la formula indicata da NUM per calcolare gli errori relativi." #: options.c:95 msgid "If 'NUM' is 0 use the classic formula." msgstr "Se 'NUM' è 0 usa la formula classica." #: options.c:96 msgid "" "If 'NUM' is 1 compute the relative errors by considering\n" " the values in FILE1 as sample values." msgstr "" "Se 'NUM' è 1 calcola gli errori relativi considerando\n" " i valori in FILE1 come valori campione." #: options.c:97 msgid "" "If 'NUM' is 2 compute the relative errors by considering\n" " the values in FILE2 as sample values." msgstr "" "Se 'NUM' è 2 calcola gli errori relativi considerando\n" " i valori in FILE2 come valori campione." #: options.c:99 msgid "" "Set to NUM the number of digits in the significands\n" " used in multiple precision arithmetic" msgstr "" "Imposta a NUM il numero di cifre significative\n" " usate nell'aritmetica a precisione multipla" #: options.c:101 msgid "" "Ignore all differences due to numeric fields of the second file that\n" " are less than the corresponding numeric fields in the first file" msgstr "" "Ignora tutte le differenze dovute a campi numerici del secondo file\n" " che sono minori dei corrispondenti campi numerici nel primo file" #: options.c:103 msgid "" "Ignore all differences due to numeric fields of the second file that\n" " are greater than the corresponding numeric fields in the first file" msgstr "" "Ignora tutte le differenze dovute a campi numerici del secondo file\n" " che sono maggiori dei corrispondenti campi numerici nel primo file" #: options.c:105 msgid "Ignore changes in case while doing literal comparisons" msgstr "" "Nel fare confronti letterali\n" " ignora le differenze del tipo maiuscolo/minuscolo" #: options.c:107 msgid "Set to CURRNAME the currency name for the two files to compare." msgstr "Imposta a CURRNAME il nome della valuta per i due file da confrontare." #: options.c:108 msgid "" "CURRNAME must be prefixed with 1: or 2: to specify the\n" " currency name only for the first or the second file" msgstr "" "CURRNAME deve essere preceduto dal prefisso 1: o 2: per specificare\n" " il nome della valuta solo per il primo ovvero per il secondo file" #: options.c:110 msgid "" "Specify the characters representing the decimal point\n" " in the two files to compare" msgstr "" "Specifica i caratteri rappresentanti il punto decimale\n" " nei due file da confrontare" #: options.c:112 msgid "" "Specify the characters representing the thousands separator\n" " in the two files to compare" msgstr "" "Specifica i caratteri rappresentanti il separatore delle migliaia\n" " nei due file da confrontare" #: options.c:114 msgid "" "Specify the number of digits forming each group of thousands\n" " in the two files to compare" msgstr "" "Specifica il numero di cifre che formano ogni gruppo di migliaia\n" " nei due file da confrontare" #: options.c:116 msgid "" "Specify the (optional) prefixes for positive values\n" " used in the two files to compare" msgstr "" "Specifica i prefissi (opzionali) per valori positivi\n" " usati nei due file da confrontare" #: options.c:118 msgid "" "Specify the prefixes for negative values\n" " used in the two files to compare" msgstr "" "Specifica i prefissi per valori negativi\n" " usati nei due file da confrontare" #: options.c:120 msgid "" "Specify the exponent letters\n" " used in the two files to compare" msgstr "" "Specifica i simboli che precedono l'esponente decimale\n" " nei due file da confrontare" #: options.c:122 msgid "" "Specify the characters representing the imaginary unit\n" " in the two files to compare" msgstr "" "Specifica i caratteri rappresentanti l'unità immaginaria\n" " nei due file da confrontare" #: options.c:124 msgid "Select the fields of the first file that have to be ignored" msgstr "Seleziona i campi del primo file che devono essere ignorati" #: options.c:126 msgid "Select the fields of the second file that have to be ignored" msgstr "Seleziona i campi del secondo file che devono essere ignorati" #: options.c:128 msgid "" "While printing the differences between the two compared files\n" " show only the numerical ones" msgstr "" "Nello stampare le differenze tra i due file confrontati\n" " mostra solo quelle di tipo numerico" #: options.c:130 msgid "" "While printing the differences between the two compared files\n" " neglect all the numerical ones (dummy mode)" msgstr "" "Nello stampare le differenze tra i due file confrontati\n" " trascura tutte quelle di tipo numerico (modalità stupida)" #: options.c:132 msgid "" "Suppress all messages concerning the differences discovered\n" " in the structures of the two files" msgstr "" "Sopprimi tutti i messaggi relativi alle differenze scoperte\n" " nelle strutture dei due file" #: options.c:134 msgid "" "For every couple of lines which differ in at least one field print\n" " an header to show how these lines appear in the two compared files" msgstr "" "Per ogni coppia di linee che differiscono in almeno un campo stampa una\n" " intestazione per mostrare come esse appaiono nei due file confrontati" #: options.c:136 msgid "" "Display a side by side difference listing of the two files\n" " showing which lines are present only in one file, which\n" " lines are present in both files but with one or more differing fields,\n" " and which lines are identical." msgstr "" "Stampa un elenco a colonne affiancate delle differenze tra i due file,\n" " mostrando quali linee sono presenti solo in un file, quali linee\n" " sono presenti in entrambi i file ma con uno o più campi differenti\n" " e quali linee sono identiche." #: options.c:137 options.c:160 msgid "" "If 'NUM' is zero or is not specified, output at most 130 columns per line." msgstr "" "Se 'NUM' è zero o non è specificato, visualizza al più\n" " 130 colonne per linea." #: options.c:138 options.c:161 msgid "If 'NUM' is a positive number, output at most 'NUM' columns per line." msgstr "" "Se 'NUM' è un numero positivo, visualizza al più\n" " 'NUM' colonne per linea." #: options.c:139 options.c:162 msgid "" "If 'NUM' is a negative number, do not output common lines\n" " and display at most -'NUM' columns per line." msgstr "" "Se 'NUM' è un numero negativo, non stampare le linee comuni\n" " ai due file e visualizza al più -'NUM' colonne per linea." #: options.c:141 msgid "" "Display the differences between the two compared files\n" " in raw format (not very convenient for humans)" msgstr "" "Visualizza in formato `raw' le differenze tra i due file\n" " confrontati (non molto adatto per gli esseri umani)" #: options.c:143 msgid "Suppress all the standard output" msgstr "Sopprimi completamente l'output standard del programma" #: options.c:145 msgid "Add some statistics to the standard output" msgstr "Aggiungi alcune informazioni di tipo statistico all'output standard" #: options.c:147 msgid "" "Select the fields of the first file that have to be\n" " blurred during the synchronization procedure\n" " only if they turn out to be numeric" msgstr "" "Seleziona i campi del primo file che devono essere\n" " offuscati durante la procedura di sincronizzazione\n" " quando risultano essere di tipo numerico" #: options.c:149 msgid "" "Select the fields of the second file that have to be\n" " blurred during the synchronization procedure\n" " only if they turn out to be numeric" msgstr "" "Seleziona i campi del secondo file che devono essere\n" " offuscati durante la procedura di sincronizzazione\n" " quando risultano essere di tipo numerico" #: options.c:151 msgid "" "Select the fields of the first file that have to be\n" " unconditionally blurred during the synchronization procedure" msgstr "" "Seleziona i campi del primo file che devono essere\n" " sempre offuscati durante la procedura di sincronizzazione" #: options.c:153 msgid "" "Select the fields of the second file that have to be\n" " unconditionally blurred during the synchronization procedure" msgstr "" "Seleziona i campi del secondo file che devono essere\n" " sempre offuscati durante la procedura di sincronizzazione" #: options.c:155 msgid "During synchronization try hard to find a smaller set of changes" msgstr "" "Durante la sincronizzazione cerca ad ogni costo di trovare\n" " una catena minimale di modifiche" #: options.c:157 msgid "" "During synchronization assume large files and\n" " many scattered small changes" msgstr "" "Durante la sincronizzazione assumi di lavorare su file grandi\n" " con tante piccole differenze sparpagliate" #: options.c:159 msgid "" "Run only the filter and then show the results of its\n" " attempt to synchronize the two files." msgstr "" "Esegui solo il filtraggio e quindi mostra i risultati del\n" " suo tentativo di sincronizzare i due file." #: options.c:164 msgid "" "Expand tabs to spaces in output while displaying the results of the\n" " synchronization procedure (meaningful only together with option -O or -f)" msgstr "" "Espandi le tabulazioni a spazi bianchi mentre stampi i risultati della\n" " procedura di sincronizzazione (utile solo con le opzioni -O e -f)" #: options.c:166 msgid "Treat both files as binary files (only meaningful under Doz/Windoz)" msgstr "Tratta entrambi i file come binari (utile solo sotto Doz/Windoz)" #: options.c:168 msgid "Redirect warning and error messages from stderr to the indicated file" msgstr "" "Reindirizza avvertimenti e messaggi di errore\n" " dallo standard error (schermo) al file indicato" #: options.c:170 msgid "Redirect output from stdout to the indicated file" msgstr "Reindirizza l'output dallo standard output (schermo) al file indicato" #: options.c:171 msgid "Show help message and predefined settings" msgstr "Mostra questo messaggio di aiuto e le impostazioni predefinite" #: options.c:172 msgid "Show version number, Copyright, Distribution Terms and NO-Warranty" msgstr "" "Mostra numero di versione, copyright,\n" " termini di distribuzione e NON-Garanzia" #: options.c:174 msgid "" "\n" " Default numeric format (for both files to compare):\n" msgstr "" "\n" " Formato numerico predefinito (per entrambi i file da confrontare):\n" #: options.c:175 #, c-format msgid "Currency name = \"%s\"\n" msgstr "Nome della valuta = \"%s\"\n" #: options.c:176 #, c-format msgid "Decimal point = `%c'\n" msgstr "Punto decimale = `%c'\n" #: options.c:178 options.c:931 options.c:962 #, c-format msgid "Thousands separator = `%c'\n" msgstr "Separatore delle migliaia = `%c'\n" #: options.c:179 #, c-format msgid "Number of digits in each thousands group = %u\n" msgstr "Numero di cifre in ogni gruppo di migliaia = %u\n" #: options.c:181 options.c:932 options.c:963 #, c-format msgid "Leading positive sign = `%c'\n" msgstr "Segno iniziale per numeri positivi = `%c'\n" #: options.c:182 options.c:933 options.c:964 #, c-format msgid "Leading negative sign = `%c'\n" msgstr "Segno iniziale per numeri negativi = `%c'\n" #: options.c:183 options.c:934 options.c:965 #, c-format msgid "Prefix for decimal exponent = `%c'\n" msgstr "Prefisso per esponente decimale = `%c'\n" #: options.c:184 options.c:937 options.c:968 #, c-format msgid "" "Symbol used to denote the imaginary unit = `%c'\n" "\n" msgstr "" "Simbolo usato per indicare l'unità immaginaria = `%c'\n" "\n" #: options.c:429 options.c:476 options.c:491 options.c:508 options.c:523 #: options.c:546 options.c:769 options.c:797 options.c:840 options.c:855 #, c-format msgid "%s: invalid argument after `-%c' option\n" msgstr "%s: un argomento non valido segue l'opzione `-%c'\n" #: options.c:564 options.c:578 options.c:598 options.c:631 options.c:645 #: options.c:665 #, c-format msgid "%s: memory exhausted\n" msgstr "%s: memoria esaurita\n" #: options.c:606 options.c:672 options.c:690 options.c:697 options.c:709 #: options.c:716 options.c:753 #, c-format msgid "%s: invalid argument after `-%c' option:\n" msgstr "%s: un argomento non valido segue l'opzione `-%c':\n" #: options.c:608 #, c-format msgid "" " The list of field delimiters can not be empty and\n" " must always include the newline character ('\\n')\n" msgstr "" " La lista di separatori di campo non può essere vuota\n" " e deve sempre includere il carattere di nuova linea ('\\n')\n" #: options.c:674 #, c-format msgid "" " The list of field delimiters cannot be empty and\n" " must always include the newline string (\"\\n\").\n" " Care that the newline character cannot appear\n" " in any other delimiter than the newline string\n" msgstr "" " La lista di separatori di campo non può essere vuota\n" " e deve sempre includere la stringa di nuova linea (\"\\n\").\n" " Inoltre, il carattere di nuova linea non può\n" " apparire in alcun altro separatore di campo\n" #: options.c:692 options.c:711 #, c-format msgid " The format specification has not been respected\n" msgstr " La specifica di formato non è stata rispettata\n" #: options.c:699 options.c:718 #, c-format msgid " The specified ranges do not have the same length\n" msgstr " Gli intervalli specificati non hanno la stessa lunghezza\n" #: options.c:755 #, c-format msgid " you have missed to specify the currency name\n" msgstr " hai dimenticato di specificare il nome della valuta\n" #: options.c:866 options.c:876 #, c-format msgid "%s: cannot open file \"%s\":\n" msgstr "%s: impossibile aprire il file \"%s\":\n" #: options.c:927 #, c-format msgid "The numeric format specified for the first file is illegal,\n" msgstr "Il formato numerico specificato per il primo file è inaccettabile,\n" #: options.c:929 options.c:960 #, c-format msgid "" "the following symbols should be all different\n" "while two or more of them are actually equal:\n" msgstr "" "i simboli seguenti dovrebbero essere tutti diversi\n" "mentre due o più di essi sono in realtà uguali:\n" #: options.c:930 options.c:961 #, c-format msgid "" "\n" "Decimal point = `%c'\n" msgstr "" "\n" "Punto decimale = `%c'\n" #: options.c:944 #, c-format msgid "The numeric format specified for the first file is illegal:\n" msgstr "Il formato numerico specificato per il primo file è inaccettabile:\n" #: options.c:946 options.c:977 #, c-format msgid "the name of the currency may not contain digits,\n" msgstr "il nome della valuta non può contenere cifre numeriche,\n" #: options.c:948 options.c:979 #, c-format msgid "the symbol for the leading positive sign (`%c'),\n" msgstr "il prefisso per numeri positivi (`%c'),\n" #: options.c:950 options.c:981 #, c-format msgid "the symbol for the leading negative sign (`%c'),\n" msgstr "il prefisso per numeri negativi (`%c'),\n" #: options.c:952 options.c:983 #, c-format msgid "the decimal point (`%c'), or the thousands separator (`%c')\n" msgstr "il punto decimale (`%c'), o il separatore delle migliaia (`%c')\n" #: options.c:958 #, c-format msgid "The numeric format specified for the second file is illegal,\n" msgstr "Il formato numerico specificato per il secondo file è inaccettabile,\n" #: options.c:975 #, c-format msgid "The numeric format specified for the second file is illegal:\n" msgstr "Il formato numerico specificato per il secondo file è inaccettabile:\n" #: thrlist.c:341 #, c-format msgid "Fatal error occurred during comparison of two numerical fields\n" msgstr "" "Si è verificato un errore inemendabile durante\n" "il confronto di due campi numerici\n" #: xalloc-die.c:35 msgid "memory exhausted" msgstr "memoria esaurita" numdiff-5.9.0/po/numdiff/it.mo0000644000175000017500000006723613054341114015532 0ustar paologpaologÞ•£4ßL È É 7è g gˆ>ð)/4Y1Ž4À'õ$2B)u/Ÿ‰ÏYy™?°GðG8%€ΦºuP0(.ªEÙ?#_2ƒg¶Å3䉆¢/)DYDžãÿR(l)•¿Ù,ï%:,`- »&Ü#:C~9™,Ó.g/3—ËßõM 2W*Šnµ$²ÈäÞiÃN- @| N½ ‘ !,ž!-Ë!?ù!>9"‰x"&#b)#bŒ#jï#EZ$J $†ë$ƒr%mö%Æd&Œ+'‰¸'6B( y(…(£(ÍÁ(.)#¾)qâ)1T*E†*^Ì*++>+ŒS+tà+;U,‘,u-<•-?Ò-].p./)’/B¼/Xÿ/UX0V®0[1Aa1\£1M2bN2_±2b3 t31•3RÇ3`4<{4<¸4=õ4=35[q5bÍ5M06J~6É6Cå6)7>7@E7m†7^ô7S8o8 €8£¡8E9H9 e9<†9&Ã9\ê91G:1y:1«:”Ý:r<F’<]Ù<]7=V•=&ì=R>>f>9¥>,ß>% ?32?)f?:?“Ë?!_@!@£@K»@LALTA2¡AÙÔAË®B`zC)ÛC:DY@DHšD/ãD2EuFEÒ¼E;F›ËF™gG6HP8HQ‰H%ÛH IY"I2|I3¯IãIJ)JAJ.`J)J*¹J!äJ-K)4K)^KDˆKÍK3èKWL/tLw¤L3MPMeMyMYŽM8èMC!N‰eN™ïN‰O£OõºOp°Pk!Q_QKíQŒ9R.ÆR.õRS$SLxS‘ÅS&WTb~TbáT{DUOÀUTVeVŒõV‚‚WÕXŠÛXˆfYRïY BZ*NZ*yZë¤Z0['Á[é[Fk\b²\h].~]=­]–ë]p‚^;ó^˜/_rÈ_=;`Fy`^À`¢a¢Âa>ebQ¤bZöbVQcY¨cadVdd`»dNesketße\Tf6±f8èfV!gcxgDÜgD!hFfhF­hgôhr\iPÏiD j!ej@‡jÈjæjAëjv-k_¤k#l(l!9l£[lÿlm "m@Cm'„me¬m9n(Ln(un D—£BZ•Uœzyc 8Ž™CsV‰ˆ›Ebfh XM^Šr_K¢jPx!W iI$-a 'oe>‡Œ4žšd(˜“*w]O}\‹L/kR{¡‚G2 –„QgF0’†l@‘.=vJ”…%<ŸN,: `Y";&n|7mpƒ)6H39t~?#uS51T[q+€A Sum of all absolute errors: Default numeric format (for both files to compare): In the computation of the following quantities only the errors with negative sign are considered: In the computation of the following quantities only the errors with positive sign are considered: *** End of file "%s" reached while trying to read line %lu. *** Error while reading from file "%s" *** File "%s" is binary, *** cannot read from it *** Out of memory while reading from file "%s" *** The requested comparison cannot be performed: +++ File "%s" differs from file "%s" +++ Files "%s" and "%s" are equal +++ Files "%s" and "%s" have the same structure Arithmetic mean of all absolute errors: Arithmetic mean of the major absolute errors: Compare putatively similar files line by line and field by field, ignoring small numeric differences or/and different numeric formats. Corresponding absolute error: Corresponding relative error: Decimal point = `%c' First occurrence (#line, #field) in the first file: %lu, %lu Largest absolute error in the set of the major numerical differences: Largest relative error in the set of the major numerical differences: No numeric comparison has been done One numeric comparison has been done and has produced an outcome beyond the tolerance threshold %d numeric comparisons have been done, all of them have produced an outcome beyond the tolerance threshold One numeric comparison has been done and the resulting numeric difference is negligible %d numeric comparisons have been done and the resulting numeric differences are all negligible One numeric comparison has been done, %d numeric comparisons have been done, Quadratic mean of all absolute errors: Quadratic mean of the major absolute errors: Square root of the sum of the squares of the major absolute errors: Square root of the sum of the squares of all absolute errors: Sum of the major absolute errors: The format specification has not been respected The list of field delimiters can not be empty and must always include the newline character ('\n') The list of field delimiters cannot be empty and must always include the newline string ("\n"). Care that the newline character cannot appear in any other delimiter than the newline string The specified ranges do not have the same length differences due to numeric fields of the second file that are greater than the corresponding fields in the first file are neglected differences due to numeric fields of the second file that are less than the corresponding fields in the first file are neglected you have missed to specify the currency name %s: a number with a too large exponent has been found, namely "%s". %s: a number with a too small exponent has been found, namely "%s". %s: cannot open file "%s": %s: illegal option -- %c %s: insufficient memory for new allocation, the execution of the program ends now %s: invalid argument after `-%c' option %s: invalid argument after `-%c' option: %s: invalid option -- %c %s: memory exhausted %s: option `%c%s' doesn't allow an argument %s: option `%s' is ambiguous %s: option `%s' requires an argument %s: option `--%s' doesn't allow an argument %s: option `-W %s' doesn't allow an argument %s: option `-W %s' is ambiguous %s: option requires an argument -- %c %s: unrecognized option `%c%s' %s: unrecognized option `--%s' (The default set of delimiters is space, tab and newline).*** %s: memory exhausted *** At least one between "%s" and "%s" is a binary file *** Fatal error occurred in function %s: %s*** File "%s" has more lines than file "%s", *** a very long line has been encountered which contains *** too many fields to be correctly handled *** line %lu is the last one read from file "%s" , Relative error = @ Absolute error = @ Line %lu in file "%s" contains too many fields to be properly processed! @ Line %lu in file "%s" is shorter than expected! Add some statistics to the standard outputCURRNAME must be prefixed with 1: or 2: to specify the currency name only for the first or the second fileConsider two numerical values as equal only if both absolute and relative difference do not exceed the respective tolerance thresholdCurrency name = "%s" Decimal point = `%c' Display a side by side difference listing of the two files showing which lines are present only in one file, which lines are present in both files but with one or more differing fields, and which lines are identical.Display the differences between the two compared files in raw format (not very convenient for humans)During synchronization assume large files and many scattered small changesDuring synchronization try hard to find a smaller set of changesExit status: 1 if files differ, 0 if they are equal, -1 (255) in case of errorExpand tabs to spaces in output while displaying the results of the synchronization procedure (meaningful only together with option -O or -f)Exponents larger than %ld are not accepted, Exponents smaller than %ld are not accepted, Fatal error occurred during comparison of two numerical fields First occurrence (#line, #field) in the second file: %lu, %lu For every couple of lines which differ in at least one field print an header to show how these lines appear in the two compared filesIf 'NUM' is 0 use the classic formula.If 'NUM' is 1 compute the relative errors by considering the values in FILE1 as sample values.If 'NUM' is 2 compute the relative errors by considering the values in FILE2 as sample values.If 'NUM' is a negative number, do not output common lines and display at most -'NUM' columns per line.If 'NUM' is a positive number, output at most 'NUM' columns per line.If 'NUM' is zero or is not specified, output at most 130 columns per line.If DELIMS is prefixed with 1: or 2:, use the given delimiter set only for the lines from the first or the second file respectivelyIf IFS is prefixed with 1: or 2:, use the given delimiter set only for the lines from the first or the second file respectivelyIf a RANGE is given, use the specified threshold only when comparing fields whose positions lie in RANGE.If both RANGE1 and RANGE2 are given and have the same length, then use the specified threshold when comparing a field of FILE1 lying in RANGE1 with the corresponding field of FILE2 in RANGE2Ignore all differences due to numeric fields of the second file that are greater than the corresponding numeric fields in the first fileIgnore all differences due to numeric fields of the second file that are less than the corresponding numeric fields in the first fileIgnore changes in case while doing literal comparisonsIvano PrimiLeading negative sign = `%c' Leading positive sign = `%c' License GPLv3+: GNU GPL version 3 or later, see . This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Number of digits in each thousands group = %u Prefix for decimal exponent = `%c' RANGE, RANGE1 and RANGE2 stay for a positive integer value or for a range of integer values, like 1-, 3-5 or -7. Redirect output from stdout to the indicated fileRedirect warning and error messages from stderr to the indicated fileRun only the filter and then show the results of its attempt to synchronize the two files.Runtime error: %s Runtime warning: %s Select the fields of the first file that have to be blurred during the synchronization procedure only if they turn out to be numericSelect the fields of the first file that have to be unconditionally blurred during the synchronization procedureSelect the fields of the first file that have to be ignoredSelect the fields of the second file that have to be blurred during the synchronization procedure only if they turn out to be numericSelect the fields of the second file that have to be unconditionally blurred during the synchronization procedureSelect the fields of the second file that have to be ignoredSet to CURRNAME the currency name for the two files to compare.Set to NUM the number of digits in the significands used in multiple precision arithmeticSet to THRVAL the maximum absolute difference permitted before two numeric fields are regarded as different (The default value is zero).Set to THRVAL the maximum relative difference permitted before two numeric fields are regarded as different (The default value is zero).Show help message and predefined settingsShow version number, Copyright, Distribution Terms and NO-WarrantySpecify the (optional) prefixes for positive values used in the two files to compareSpecify the characters representing the decimal point in the two files to compareSpecify the characters representing the imaginary unit in the two files to compareSpecify the characters representing the thousands separator in the two files to compareSpecify the exponent letters used in the two files to compareSpecify the number of digits forming each group of thousands in the two files to compareSpecify the prefixes for negative values used in the two files to compareSpecify the set of characters to use as delimiters while splitting the input lines into fieldsSpecify the set of strings to use as delimiters while splitting the input lines into fieldsSuppress all messages concerning the differences discovered in the structures of the two filesSuppress all the standard outputSymbol used to denote the imaginary unit = `%c' The complete paths of the files should be given, a directory name is not accepted.The given paths cannot refer to the same file but one of them can be "-", which refers to stdin.The numeric format specified for the first file is illegal, The numeric format specified for the first file is illegal: The numeric format specified for the second file is illegal, The numeric format specified for the second file is illegal: The software has been built with its own internal support for multiple precision arithmeticThe software has been linked against the GNU Multiple Precision Arithmetic Library, version numberThe string "%s" is not a valid number, the execution of the program ends now The two arguments after the options are the names of the files to compare.Thousands separator = `%c' Treat both files as binary files (only meaningful under Doz/Windoz)Unknown system errorUsage:Use the formula indicated by NUM to compute the relative errors.While printing the differences between the two compared files neglect all the numerical ones (dummy mode)While printing the differences between the two compared files show only the numerical onesexponent too large in raisememory exhaustedmodulus is not an integral valueonly one numeric comparison has produced an outcome beyond the tolerance threshold %d numeric comparisons have produced an outcome beyond the tolerance threshold orpower with non integral basepower with non integral exponentthe decimal point (`%c'), or the thousands separator (`%c') the execution of the program ends now the following symbols should be all different while two or more of them are actually equal: the name of the currency may not contain digits, the symbol for the leading negative sign (`%c'), the symbol for the leading positive sign (`%c'), Project-Id-Version: numdiff 5.9.0 Report-Msgid-Bugs-To: ivprimi@libero.it POT-Creation-Date: 2017-02-12 22:11+0100 PO-Revision-Date: 2017-01-01 17:16+0100 Last-Translator: Ivano Primi Language-Team: ITALIAN Language: Italian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1 ? 1 : 0; Somma degli errori assoluti: Formato numerico predefinito (per entrambi i file da confrontare): Nel calcolo dei seguenti valori vengono considerati solo gli errori con segno negativo: Nel calcolo dei seguenti valori vengono considerati solo gli errori con segno positivo: *** Raggiunta la fine del file "%s" *** mentre si cercava di leggere la linea %lu. *** Errore in lettura dal file "%s" *** Il file "%s" è un file binario, *** non è possibile leggere dati da esso *** Esaurimento di memoria durante la lettura del file "%s" *** Il confronto richiesto non può essere effettuato: +++ Il file "%s" differisce dal file "%s" +++ I file "%s" e "%s" sono uguali +++ I file "%s" e "%s" hanno la stessa struttura Media aritmetica degli errori assoluti: Media aritmetica degli errori assoluti non trascurabili: Confronta file grossolanamente simili linea per linea e campo per campo, ignorando piccole differenze numeriche o/e formati numerici differenti. Corrispondente errore assoluto: Corrispondente errore relativo: Punto decimale = `%c' Prima posizione di rinvenimento (#linea, #campo) nel primo file: %lu, %lu Massimo errore assoluto nell'insieme delle differenze numeriche rilevanti: Massimo errore relativo nell'insieme delle differenze numeriche rilevanti: Non è stato effettuato alcun confronto numerico È stato effettuato un solo confronto numerico e ha prodotto un risultato oltre la soglia di tolleranza Sono stati effettuati %d confronti numerici e tutti hanno prodotto un risultato oltre la soglia di tolleranza È stato effettuato un solo confronto numerico e la differenza numerica rilevata è trascurabile Sono stati effettuati %d confronti numerici e le differenze numeriche rilevate sono tutte trascurabili È stato effettuato un solo confronto numerico, Sono stati effettuati %d confronti numerici, Media quadratica degli errori assoluti: Media quadratica degli errori assoluti non trascurabili: Radice quadrata della somma dei quadrati di tutti gli errori assoluti non trascurabili: Radice quadrata della somma dei quadrati di tutti gli errori assoluti: Somma degli errori assoluti non trascurabili: La specifica di formato non è stata rispettata La lista di separatori di campo non può essere vuota e deve sempre includere il carattere di nuova linea ('\n') La lista di separatori di campo non può essere vuota e deve sempre includere la stringa di nuova linea ("\n"). Inoltre, il carattere di nuova linea non può apparire in alcun altro separatore di campo Gli intervalli specificati non hanno la stessa lunghezza le differenze dovute a campi numerici del secondo file che risultano essere maggiori dei corrispondenti campi del primo file sono state tralasciate le differenze dovute a campi numerici del secondo file che risultano essere minori dei corrispondenti campi del primo file sono state tralasciate hai dimenticato di specificare il nome della valuta %s: è stato trovato un numero con un esponente troppo alto, precisamente "%s". %s: è stato trovato un numero con un esponente troppo basso, precisamente "%s". %s: impossibile aprire il file "%s": %s: opzione inammissibile -- %c %s: memoria insufficiente per nuova assegnazione, l'esecuzione del programma finisce qui %s: un argomento non valido segue l'opzione `-%c' %s: un argomento non valido segue l'opzione `-%c': %s: opzione non valida -- %c %s: memoria esaurita %s: l'opzione `%c%s' non vuole argomenti %s: l'opzione `%s' è ambigua %s: l'opzione `%s' ha bisogno di un argomento %s: l'opzione `--%s' non vuole argomenti %s: l'opzione `-W %s' non vuole argomenti %s: l'opzione `-W %s' è ambigua %s: opzione con argomento obbligatorio -- %c %s: l'opzione `%c%s' risulta sconosciuta %s: l'opzione `--%s' risulta sconosciuta (l'insieme predefinito è spazio bianco, tabulazione e nuova linea).*** %s: memoria esaurita *** Almeno uno tra "%s" e "%s" è un file binario *** Errore non emendabile verificatosi durante *** l'esecuzione della funzione %s: %s*** Il file "%s" ha più linee del file "%s", *** È stata incontrata una linea molto lunga che contiene *** troppi campi per poter essere elaborata correttamente *** la linea %lu è l'ultima letta dal file "%s" , Errore relativo = @ Errore assoluto = @ La linea %lu nel file "%s" contiene troppi campi per essere elaborata correttamente! @ La linea %lu nel file "%s" è più corta del previsto Aggiungi alcune informazioni di tipo statistico all'output standardCURRNAME deve essere preceduto dal prefisso 1: o 2: per specificare il nome della valuta solo per il primo ovvero per il secondo fileConsidera due campi numerici come uguali solo se la differenza assoluta e quella relativa sono entrambe dentro la rispettiva soglia di tolleranzaNome della valuta = "%s" Punto decimale = `%c' Stampa un elenco a colonne affiancate delle differenze tra i due file, mostrando quali linee sono presenti solo in un file, quali linee sono presenti in entrambi i file ma con uno o più campi differenti e quali linee sono identiche.Visualizza in formato `raw' le differenze tra i due file confrontati (non molto adatto per gli esseri umani)Durante la sincronizzazione assumi di lavorare su file grandi con tante piccole differenze sparpagliateDurante la sincronizzazione cerca ad ogni costo di trovare una catena minimale di modificheCodice di uscita: 1 se i file sono diversi, 0 se uguali, -1 (255) su erroreEspandi le tabulazioni a spazi bianchi mentre stampi i risultati della procedura di sincronizzazione (utile solo con le opzioni -O e -f)Esponenti superiori a %ld non sono accettati, Esponenti inferiori a %ld non sono accettati, Si è verificato un errore inemendabile durante il confronto di due campi numerici Prima posizione di rinvenimento (#linea, #campo) nel secondo file: %lu, %lu Per ogni coppia di linee che differiscono in almeno un campo stampa una intestazione per mostrare come esse appaiono nei due file confrontatiSe 'NUM' è 0 usa la formula classica.Se 'NUM' è 1 calcola gli errori relativi considerando i valori in FILE1 come valori campione.Se 'NUM' è 2 calcola gli errori relativi considerando i valori in FILE2 come valori campione.Se 'NUM' è un numero negativo, non stampare le linee comuni ai due file e visualizza al più -'NUM' colonne per linea.Se 'NUM' è un numero positivo, visualizza al più 'NUM' colonne per linea.Se 'NUM' è zero o non è specificato, visualizza al più 130 colonne per linea.Se DELIMS è preceduto dal prefisso 1: o da 2:, usa l'insieme di separatori specificato solo per le linee del primo ovvero del secondo fileSe IFS è preceduto dal prefisso 1: o da 2:, usa l'insieme di separatori specificato solo per le linee del primo ovvero del secondo fileSe un solo RANGE è dato, usa il valore di soglia specificato solo per confrontare campi le cui posizioni cadono dentro RANGE.Se sono dati sia RANGE1 che RANGE2 ed hanno la stessa lunghezza, usa il valore di soglia specificato solo per confrontare un campo di FILE1 che cade in RANGE1 con il corrispondente campo di FILE2 in RANGE2Ignora tutte le differenze dovute a campi numerici del secondo file che sono maggiori dei corrispondenti campi numerici nel primo fileIgnora tutte le differenze dovute a campi numerici del secondo file che sono minori dei corrispondenti campi numerici nel primo fileNel fare confronti letterali ignora le differenze del tipo maiuscolo/minuscoloIvano PrimiSegno iniziale per numeri negativi = `%c' Segno iniziale per numeri positivi = `%c' Licenza GPLv3+: GNU GPL versione 3 o successiva, vedi . Questo è software libero: sei libero di modificarlo e redistribuirlo. NON c'è NESSUNA GARANZIA, per quanto consentito dalle vigenti normative. Numero di cifre in ogni gruppo di migliaia = %u Prefisso per esponente decimale = `%c' RANGE, RANGE1 e RANGE2 stanno per un valore intero positivo oppure per un intervallo di valori interi, per esempio 1-, 3-5 o -7. Reindirizza l'output dallo standard output (schermo) al file indicatoReindirizza avvertimenti e messaggi di errore dallo standard error (schermo) al file indicatoEsegui solo il filtraggio e quindi mostra i risultati del suo tentativo di sincronizzare i due file.Errore durante l'esecuzione del programma: %s Avvertimento lanciato durante l'esecuzione del programma: %s Seleziona i campi del primo file che devono essere offuscati durante la procedura di sincronizzazione quando risultano essere di tipo numericoSeleziona i campi del primo file che devono essere sempre offuscati durante la procedura di sincronizzazioneSeleziona i campi del primo file che devono essere ignoratiSeleziona i campi del secondo file che devono essere offuscati durante la procedura di sincronizzazione quando risultano essere di tipo numericoSeleziona i campi del secondo file che devono essere sempre offuscati durante la procedura di sincronizzazioneSeleziona i campi del secondo file che devono essere ignoratiImposta a CURRNAME il nome della valuta per i due file da confrontare.Imposta a NUM il numero di cifre significative usate nell'aritmetica a precisione multiplaImposta al valore THRVAL la massima differenza assoluta consentita prima che due campi numerici siano considerati diversi (il valore predefinito è zero).Imposta al valore THRVAL la massima differenza relativa consentita prima che due campi numerici siano considerati diversi (il valore predefinito è zero).Mostra questo messaggio di aiuto e le impostazioni predefiniteMostra numero di versione, copyright, termini di distribuzione e NON-GaranziaSpecifica i prefissi (opzionali) per valori positivi usati nei due file da confrontareSpecifica i caratteri rappresentanti il punto decimale nei due file da confrontareSpecifica i caratteri rappresentanti l'unità immaginaria nei due file da confrontareSpecifica i caratteri rappresentanti il separatore delle migliaia nei due file da confrontareSpecifica i simboli che precedono l'esponente decimale nei due file da confrontareSpecifica il numero di cifre che formano ogni gruppo di migliaia nei due file da confrontareSpecifica i prefissi per valori negativi usati nei due file da confrontareSpecifica l'insieme dei caratteri da usare come separatori al momento di suddividere le linee di input in campiSpecifica l'insieme delle stringhe da usare come separatori al momento di suddividere le linee di input in campiSopprimi tutti i messaggi relativi alle differenze scoperte nelle strutture dei due fileSopprimi completamente l'output standard del programmaSimbolo usato per indicare l'unità immaginaria = `%c' È bene fornire i percorsi completi dei file, un nome di cartella non viene accettato.I file non possono coincidere ma uno di loro può essere "-", che si riferisce allo standard input.Il formato numerico specificato per il primo file è inaccettabile, Il formato numerico specificato per il primo file è inaccettabile: Il formato numerico specificato per il secondo file è inaccettabile, Il formato numerico specificato per il secondo file è inaccettabile: Il software è stato compilato attivando il suo supporto interno per l'aritmetica a precisione multiplaIl software è stato linkato alla libreria GNU per l'aritmetica a precisione multipla (GNU MP), numero di versioneLa stringa "%s" non è un numero valido, l'esecuzione del programma finisce qui I due argomenti dopo le opzioni sono i nomi dei file da confrontare.Separatore delle migliaia = `%c' Tratta entrambi i file come binari (utile solo sotto Doz/Windoz)Errore di sistema sconosciutoUso:Usa la formula indicata da NUM per calcolare gli errori relativi.Nello stampare le differenze tra i due file confrontati trascura tutte quelle di tipo numerico (modalità stupida)Nello stampare le differenze tra i due file confrontati mostra solo quelle di tipo numericopotenza con esponente troppo grandememoria esauritail modulo non è un valore interoun solo confronto numerico ha prodotto un risultato oltre la soglia di tolleranza %d confronti numerici hanno prodotto un risultato oltre la soglia di tolleranza oppurepotenza con base non interapotenza con esponente non interoil punto decimale (`%c'), o il separatore delle migliaia (`%c') l'esecuzione del programma finisce qui i simboli seguenti dovrebbero essere tutti diversi mentre due o più di essi sono in realtà uguali: il nome della valuta non può contenere cifre numeriche, il prefisso per numeri negativi (`%c'), il prefisso per numeri positivi (`%c'), numdiff-5.9.0/po/numdiff/numdiff.pot0000644000175000017500000005123213054341114016722 0ustar paologpaolog# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: numdiff 5.9.0\n" "Report-Msgid-Bugs-To: ivprimi@libero.it\n" "POT-Creation-Date: 2017-02-12 22:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: cmpfns.c:293 cmpfns.c:309 cmpfns.c:403 cmpfns.c:419 #, c-format msgid "" "@ Line %lu in file \"%s\"\n" " contains too many fields to be properly processed!\n" msgstr "" #: cmpfns.c:435 cmpfns.c:455 #, c-format msgid "@ Line %lu in file \"%s\" is shorter than expected!\n" msgstr "" #: cmpfns.c:596 cmpfns.c:621 cmpfns.c:654 cmpfns.c:673 #, c-format msgid "" "\n" "*** File \"%s\" is binary,\n" "*** cannot read from it\n" msgstr "" #: cmpfns.c:599 cmpfns.c:624 cmpfns.c:657 cmpfns.c:678 #, c-format msgid "" "\n" "*** Error while reading from file \"%s\"\n" msgstr "" #: cmpfns.c:602 cmpfns.c:627 cmpfns.c:660 cmpfns.c:683 #, c-format msgid "" "\n" "*** Out of memory while reading from file \"%s\"\n" msgstr "" #: cmpfns.c:609 cmpfns.c:632 cmpfns.c:639 cmpfns.c:664 #, c-format msgid "" "\n" "*** End of file \"%s\" reached while trying to read line %lu.\n" msgstr "" #: cmpfns.c:610 cmpfns.c:633 cmpfns.c:640 cmpfns.c:665 #, c-format msgid "*** File \"%s\" has more lines than file \"%s\",\n" msgstr "" #: cmpfns.c:612 cmpfns.c:635 cmpfns.c:642 cmpfns.c:667 #, c-format msgid "" "*** line %lu is the last one read from file \"%s\"\n" "\n" msgstr "" #: error.c:125 msgid "Unknown system error" msgstr "" #: errors.c:43 #, c-format msgid "" "%s: insufficient memory for new allocation,\n" "the execution of the program ends now\n" msgstr "" #: errors.c:76 #, c-format msgid "Runtime error: %s\n" msgstr "" #: errors.c:110 #, c-format msgid "Runtime warning: %s\n" msgstr "" #: flags.c:58 msgid "\n" msgstr "" #: getopt.c:551 getopt.c:570 #, c-format msgid "%s: option `%s' is ambiguous\n" msgstr "" #: getopt.c:603 getopt.c:607 #, c-format msgid "%s: option `--%s' doesn't allow an argument\n" msgstr "" #: getopt.c:616 getopt.c:621 #, c-format msgid "%s: option `%c%s' doesn't allow an argument\n" msgstr "" #: getopt.c:667 getopt.c:689 getopt.c:1020 getopt.c:1042 #, c-format msgid "%s: option `%s' requires an argument\n" msgstr "" #: getopt.c:727 getopt.c:730 #, c-format msgid "%s: unrecognized option `--%s'\n" msgstr "" #: getopt.c:738 getopt.c:741 #, c-format msgid "%s: unrecognized option `%c%s'\n" msgstr "" #: getopt.c:796 getopt.c:799 #, c-format msgid "%s: illegal option -- %c\n" msgstr "" #: getopt.c:805 getopt.c:808 #, c-format msgid "%s: invalid option -- %c\n" msgstr "" #: getopt.c:863 getopt.c:882 getopt.c:1095 getopt.c:1116 #, c-format msgid "%s: option requires an argument -- %c\n" msgstr "" #: getopt.c:935 getopt.c:954 #, c-format msgid "%s: option `-W %s' is ambiguous\n" msgstr "" #: getopt.c:978 getopt.c:999 #, c-format msgid "%s: option `-W %s' doesn't allow an argument\n" msgstr "" #: inout.c:348 util.c:121 util.c:136 util.c:242 util.c:258 #, c-format msgid "" "*** Fatal error occurred in function %s:\n" "%s" msgstr "" #: inout.c:350 util.c:123 util.c:138 util.c:244 util.c:260 msgid "" "*** a very long line has been encountered which contains\n" "*** too many fields to be correctly handled\n" msgstr "" #: io.c:129 msgid "@ Absolute error = " msgstr "" #: io.c:131 msgid ", Relative error = " msgstr "" #: main.c:361 msgid "" "\n" " In the computation of the following quantities\n" " only the errors with positive sign are considered:\n" msgstr "" #: main.c:363 msgid "" " differences due to numeric fields of the second file that are\n" " less than the corresponding fields in the first file are neglected\n" "\n" msgstr "" #: main.c:368 msgid "" "\n" " In the computation of the following quantities\n" " only the errors with negative sign are considered:\n" msgstr "" #: main.c:370 msgid "" " differences due to numeric fields of the second file that are\n" " greater than the corresponding fields in the first file are neglected\n" "\n" msgstr "" #: main.c:376 msgid "" "\n" "No numeric comparison has been done\n" msgstr "" #: main.c:380 #, c-format msgid "" "\n" "One numeric comparison has been done and\n" "the resulting numeric difference is negligible\n" msgid_plural "" "\n" "%d numeric comparisons have been done and\n" "the resulting numeric differences are all negligible\n" msgstr[0] "" msgstr[1] "" #: main.c:387 #, c-format msgid "" "\n" "One numeric comparison has been done and\n" "has produced an outcome beyond the tolerance threshold\n" msgid_plural "" "\n" "%d numeric comparisons have been done, all of them\n" "have produced an outcome beyond the tolerance threshold\n" msgstr[0] "" msgstr[1] "" #: main.c:395 #, c-format msgid "" "\n" "One numeric comparison has been done,\n" msgid_plural "" "\n" "%d numeric comparisons have been done,\n" msgstr[0] "" msgstr[1] "" #: main.c:400 #, c-format msgid "" "only one numeric comparison has produced an outcome\n" "beyond the tolerance threshold\n" msgid_plural "" "%d numeric comparisons have produced an outcome\n" "beyond the tolerance threshold\n" msgstr[0] "" msgstr[1] "" #: main.c:405 msgid "" "\n" "Largest absolute error in the set of the major numerical differences:\n" msgstr "" #: main.c:408 msgid "" "\n" "Corresponding relative error:\n" msgstr "" #: main.c:412 main.c:425 #, c-format msgid "" "\n" "First occurrence (#line, #field) in the first file: %lu, %lu\n" msgstr "" #: main.c:414 main.c:427 #, c-format msgid "First occurrence (#line, #field) in the second file: %lu, %lu\n" msgstr "" #: main.c:418 msgid "" "\n" "Largest relative error in the set of the major numerical differences:\n" msgstr "" #: main.c:421 msgid "" "\n" "Corresponding absolute error:\n" msgstr "" #: main.c:431 msgid "" "\n" "\n" "Sum of all absolute errors:\n" msgstr "" #: main.c:434 msgid "" "\n" "Sum of the major absolute errors:\n" msgstr "" #: main.c:440 msgid "" "\n" "Arithmetic mean of all absolute errors:\n" msgstr "" #: main.c:443 msgid "" "\n" "Arithmetic mean of the major absolute errors:\n" msgstr "" #: main.c:452 msgid "" "\n" "Square root of the sum of the squares of all absolute errors:\n" msgstr "" #: main.c:455 msgid "" "\n" "Quadratic mean of all absolute errors:\n" msgstr "" #: main.c:463 msgid "" "\n" "Square root of the sum of the squares\n" "of the major absolute errors:\n" msgstr "" #: main.c:466 msgid "" "\n" "Quadratic mean of the major absolute errors:\n" msgstr "" #: main.c:504 #, c-format msgid "*** %s: memory exhausted\n" msgstr "" #: main.c:557 msgid "" "\n" "*** The requested comparison cannot be performed:\n" msgstr "" #: main.c:558 #, c-format msgid "*** At least one between \"%s\" and \"%s\" is a binary file\n" msgstr "" #: main.c:583 #, c-format msgid "" "\n" "+++ Files \"%s\" and \"%s\" have the same structure\n" msgstr "" #: main.c:586 #, c-format msgid "" "\n" "+++ Files \"%s\" and \"%s\" are equal\n" msgstr "" #: main.c:590 #, c-format msgid "" "\n" "+++ File \"%s\" differs from file \"%s\"\n" msgstr "" #: new.c:151 numutil.c:157 numutil.c:312 #, c-format msgid "" "%s: a number with a too small exponent has been found,\n" "namely \"%s\".\n" msgstr "" #: new.c:152 numutil.c:158 numutil.c:313 #, c-format msgid "Exponents smaller than %ld are not accepted,\n" msgstr "" #: new.c:153 new.c:160 numutil.c:159 numutil.c:166 numutil.c:314 numutil.c:321 #, c-format msgid "the execution of the program ends now\n" msgstr "" #: new.c:158 numutil.c:164 numutil.c:319 #, c-format msgid "" "%s: a number with a too large exponent has been found,\n" "namely \"%s\".\n" msgstr "" #: new.c:159 numutil.c:165 numutil.c:320 #, c-format msgid "Exponents larger than %ld are not accepted,\n" msgstr "" #: number.c:1228 msgid "power with non integral base" msgstr "" #: number.c:1234 number.c:1285 msgid "power with non integral exponent" msgstr "" #: number.c:1241 msgid "modulus is not an integral value" msgstr "" #: number.c:1289 msgid "exponent too large in raise" msgstr "" #: numutil.c:863 #, c-format msgid "" "The string \"%s\"\n" "is not a valid number, the execution of the program ends now\n" msgstr "" #: options.c:46 msgid "Ivano Primi" msgstr "" #: options.c:47 #, c-format msgid "" "License GPLv3+: GNU GPL version 3 or later,\n" "see .\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" #: options.c:53 msgid "" "The software has been linked against\n" "the GNU Multiple Precision Arithmetic Library,\n" "version number" msgstr "" #: options.c:57 msgid "" "The software has been built with\n" "its own internal support for multiple precision arithmetic" msgstr "" #: options.c:64 msgid "Usage:" msgstr "" #: options.c:65 msgid "or" msgstr "" #: options.c:67 #, c-format msgid "" "\n" "Compare putatively similar files line by line and field by field,\n" "ignoring small numeric differences or/and different numeric formats.\n" "\n" msgstr "" #: options.c:68 #, c-format msgid "" "RANGE, RANGE1 and RANGE2 stay for a positive integer value or\n" "for a range of integer values, like 1-, 3-5 or -7.\n" msgstr "" #: options.c:70 msgid "" "The two arguments after the options are the names of the files to compare." msgstr "" #: options.c:71 msgid "" "The complete paths of the files should be given,\n" "a directory name is not accepted." msgstr "" #: options.c:72 msgid "" "The given paths cannot refer to the same file\n" "but one of them can be \"-\", which refers to stdin." msgstr "" #: options.c:73 msgid "" "Exit status: 1 if files differ, 0 if they are equal, -1 (255) in case of " "error" msgstr "" #: options.c:76 msgid "" "Specify the set of characters to use as delimiters\n" " while splitting the input lines into fields" msgstr "" #: options.c:77 options.c:81 msgid "(The default set of delimiters is space, tab and newline)." msgstr "" #: options.c:78 msgid "" "If IFS is prefixed with 1: or 2:, use the given delimiter set\n" " only for the lines from the first or the second file respectively" msgstr "" #: options.c:80 msgid "" "Specify the set of strings to use as delimiters\n" " while splitting the input lines into fields" msgstr "" #: options.c:82 msgid "" "If DELIMS is prefixed with 1: or 2:, use the given delimiter set\n" " only for the lines from the first or the second file respectively" msgstr "" #: options.c:84 msgid "" "Set to THRVAL the maximum absolute difference permitted\n" " before two numeric fields are regarded as different\n" " (The default value is zero)." msgstr "" #: options.c:85 options.c:89 msgid "" "If a RANGE is given, use the specified\n" " threshold only when comparing fields whose positions lie in RANGE." msgstr "" #: options.c:86 options.c:90 msgid "" "If both RANGE1 and RANGE2 are given and have the same length,\n" " then use the specified threshold when comparing a field of FILE1\n" " lying in RANGE1 with the corresponding field of FILE2 in RANGE2" msgstr "" #: options.c:88 msgid "" "Set to THRVAL the maximum relative difference permitted\n" " before two numeric fields are regarded as different\n" " (The default value is zero)." msgstr "" #: options.c:92 msgid "" "Consider two numerical values as equal only if\n" " both absolute and relative difference do not exceed\n" " the respective tolerance threshold" msgstr "" #: options.c:94 msgid "Use the formula indicated by NUM to compute the relative errors." msgstr "" #: options.c:95 msgid "If 'NUM' is 0 use the classic formula." msgstr "" #: options.c:96 msgid "" "If 'NUM' is 1 compute the relative errors by considering\n" " the values in FILE1 as sample values." msgstr "" #: options.c:97 msgid "" "If 'NUM' is 2 compute the relative errors by considering\n" " the values in FILE2 as sample values." msgstr "" #: options.c:99 msgid "" "Set to NUM the number of digits in the significands\n" " used in multiple precision arithmetic" msgstr "" #: options.c:101 msgid "" "Ignore all differences due to numeric fields of the second file that\n" " are less than the corresponding numeric fields in the first file" msgstr "" #: options.c:103 msgid "" "Ignore all differences due to numeric fields of the second file that\n" " are greater than the corresponding numeric fields in the first file" msgstr "" #: options.c:105 msgid "Ignore changes in case while doing literal comparisons" msgstr "" #: options.c:107 msgid "Set to CURRNAME the currency name for the two files to compare." msgstr "" #: options.c:108 msgid "" "CURRNAME must be prefixed with 1: or 2: to specify the\n" " currency name only for the first or the second file" msgstr "" #: options.c:110 msgid "" "Specify the characters representing the decimal point\n" " in the two files to compare" msgstr "" #: options.c:112 msgid "" "Specify the characters representing the thousands separator\n" " in the two files to compare" msgstr "" #: options.c:114 msgid "" "Specify the number of digits forming each group of thousands\n" " in the two files to compare" msgstr "" #: options.c:116 msgid "" "Specify the (optional) prefixes for positive values\n" " used in the two files to compare" msgstr "" #: options.c:118 msgid "" "Specify the prefixes for negative values\n" " used in the two files to compare" msgstr "" #: options.c:120 msgid "" "Specify the exponent letters\n" " used in the two files to compare" msgstr "" #: options.c:122 msgid "" "Specify the characters representing the imaginary unit\n" " in the two files to compare" msgstr "" #: options.c:124 msgid "Select the fields of the first file that have to be ignored" msgstr "" #: options.c:126 msgid "Select the fields of the second file that have to be ignored" msgstr "" #: options.c:128 msgid "" "While printing the differences between the two compared files\n" " show only the numerical ones" msgstr "" #: options.c:130 msgid "" "While printing the differences between the two compared files\n" " neglect all the numerical ones (dummy mode)" msgstr "" #: options.c:132 msgid "" "Suppress all messages concerning the differences discovered\n" " in the structures of the two files" msgstr "" #: options.c:134 msgid "" "For every couple of lines which differ in at least one field print\n" " an header to show how these lines appear in the two compared files" msgstr "" #: options.c:136 msgid "" "Display a side by side difference listing of the two files\n" " showing which lines are present only in one file, which\n" " lines are present in both files but with one or more differing fields,\n" " and which lines are identical." msgstr "" #: options.c:137 options.c:160 msgid "" "If 'NUM' is zero or is not specified, output at most 130 columns per line." msgstr "" #: options.c:138 options.c:161 msgid "If 'NUM' is a positive number, output at most 'NUM' columns per line." msgstr "" #: options.c:139 options.c:162 msgid "" "If 'NUM' is a negative number, do not output common lines\n" " and display at most -'NUM' columns per line." msgstr "" #: options.c:141 msgid "" "Display the differences between the two compared files\n" " in raw format (not very convenient for humans)" msgstr "" #: options.c:143 msgid "Suppress all the standard output" msgstr "" #: options.c:145 msgid "Add some statistics to the standard output" msgstr "" #: options.c:147 msgid "" "Select the fields of the first file that have to be\n" " blurred during the synchronization procedure\n" " only if they turn out to be numeric" msgstr "" #: options.c:149 msgid "" "Select the fields of the second file that have to be\n" " blurred during the synchronization procedure\n" " only if they turn out to be numeric" msgstr "" #: options.c:151 msgid "" "Select the fields of the first file that have to be\n" " unconditionally blurred during the synchronization procedure" msgstr "" #: options.c:153 msgid "" "Select the fields of the second file that have to be\n" " unconditionally blurred during the synchronization procedure" msgstr "" #: options.c:155 msgid "During synchronization try hard to find a smaller set of changes" msgstr "" #: options.c:157 msgid "" "During synchronization assume large files and\n" " many scattered small changes" msgstr "" #: options.c:159 msgid "" "Run only the filter and then show the results of its\n" " attempt to synchronize the two files." msgstr "" #: options.c:164 msgid "" "Expand tabs to spaces in output while displaying the results of the\n" " synchronization procedure (meaningful only together with option -O or -f)" msgstr "" #: options.c:166 msgid "Treat both files as binary files (only meaningful under Doz/Windoz)" msgstr "" #: options.c:168 msgid "Redirect warning and error messages from stderr to the indicated file" msgstr "" #: options.c:170 msgid "Redirect output from stdout to the indicated file" msgstr "" #: options.c:171 msgid "Show help message and predefined settings" msgstr "" #: options.c:172 msgid "Show version number, Copyright, Distribution Terms and NO-Warranty" msgstr "" #: options.c:174 msgid "" "\n" " Default numeric format (for both files to compare):\n" msgstr "" #: options.c:175 #, c-format msgid "Currency name = \"%s\"\n" msgstr "" #: options.c:176 #, c-format msgid "Decimal point = `%c'\n" msgstr "" #: options.c:178 options.c:931 options.c:962 #, c-format msgid "Thousands separator = `%c'\n" msgstr "" #: options.c:179 #, c-format msgid "Number of digits in each thousands group = %u\n" msgstr "" #: options.c:181 options.c:932 options.c:963 #, c-format msgid "Leading positive sign = `%c'\n" msgstr "" #: options.c:182 options.c:933 options.c:964 #, c-format msgid "Leading negative sign = `%c'\n" msgstr "" #: options.c:183 options.c:934 options.c:965 #, c-format msgid "Prefix for decimal exponent = `%c'\n" msgstr "" #: options.c:184 options.c:937 options.c:968 #, c-format msgid "" "Symbol used to denote the imaginary unit = `%c'\n" "\n" msgstr "" #: options.c:429 options.c:476 options.c:491 options.c:508 options.c:523 #: options.c:546 options.c:769 options.c:797 options.c:840 options.c:855 #, c-format msgid "%s: invalid argument after `-%c' option\n" msgstr "" #: options.c:564 options.c:578 options.c:598 options.c:631 options.c:645 #: options.c:665 #, c-format msgid "%s: memory exhausted\n" msgstr "" #: options.c:606 options.c:672 options.c:690 options.c:697 options.c:709 #: options.c:716 options.c:753 #, c-format msgid "%s: invalid argument after `-%c' option:\n" msgstr "" #: options.c:608 #, c-format msgid "" " The list of field delimiters can not be empty and\n" " must always include the newline character ('\\n')\n" msgstr "" #: options.c:674 #, c-format msgid "" " The list of field delimiters cannot be empty and\n" " must always include the newline string (\"\\n\").\n" " Care that the newline character cannot appear\n" " in any other delimiter than the newline string\n" msgstr "" #: options.c:692 options.c:711 #, c-format msgid " The format specification has not been respected\n" msgstr "" #: options.c:699 options.c:718 #, c-format msgid " The specified ranges do not have the same length\n" msgstr "" #: options.c:755 #, c-format msgid " you have missed to specify the currency name\n" msgstr "" #: options.c:866 options.c:876 #, c-format msgid "%s: cannot open file \"%s\":\n" msgstr "" #: options.c:927 #, c-format msgid "The numeric format specified for the first file is illegal,\n" msgstr "" #: options.c:929 options.c:960 #, c-format msgid "" "the following symbols should be all different\n" "while two or more of them are actually equal:\n" msgstr "" #: options.c:930 options.c:961 #, c-format msgid "" "\n" "Decimal point = `%c'\n" msgstr "" #: options.c:944 #, c-format msgid "The numeric format specified for the first file is illegal:\n" msgstr "" #: options.c:946 options.c:977 #, c-format msgid "the name of the currency may not contain digits,\n" msgstr "" #: options.c:948 options.c:979 #, c-format msgid "the symbol for the leading positive sign (`%c'),\n" msgstr "" #: options.c:950 options.c:981 #, c-format msgid "the symbol for the leading negative sign (`%c'),\n" msgstr "" #: options.c:952 options.c:983 #, c-format msgid "the decimal point (`%c'), or the thousands separator (`%c')\n" msgstr "" #: options.c:958 #, c-format msgid "The numeric format specified for the second file is illegal,\n" msgstr "" #: options.c:975 #, c-format msgid "The numeric format specified for the second file is illegal:\n" msgstr "" #: thrlist.c:341 #, c-format msgid "Fatal error occurred during comparison of two numerical fields\n" msgstr "" #: xalloc-die.c:35 msgid "memory exhausted" msgstr "" numdiff-5.9.0/util.c0000444000175000017500000002661713054341114013630 0ustar paologpaolog/* Support routines for GNU DIFF. Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU DIFF. GNU DIFF is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU DIFF is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* This file, coming from the source code of GNU DIFF, has been modified by Ivano Primi so that it could be merged into the source code of Numdiff. Numdiff is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. Numdiff 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. */ #include "numdiff.h" #include "linesplit.h" #include #include /* Use when a system call returns non-zero status. NAME should normally be the file name. */ void perror_with_name (char const *name) { error (0, errno, "%s", name); } /* Use when a system call returns non-zero status and that is fatal. */ void pfatal_with_name (char const *name) { int e = errno; error (EXIT_TROUBLE, e, "%s", name); abort (); } /* Compare two lines (typically one from each input file) according to the command line options. For efficiency, this is invoked only when the lines do not match exactly but an option like -i might cause us to ignore the difference. Return nonzero if the lines differ. */ /* * lines_differ() is used in "inout.c" to compare lines coming possibly * from the same file. */ extern char** def_ifs; bool lines_differ (char const *s1, char const *s2, int index1, int index2, const argslist* argl) { const unsigned long fieldno_upper_limit = 8*FIELDMASK_SIZE; register char const *f1 = s1; register char const *f2 = s2; char *e1, *e2, ch1, ch2; unsigned long fieldno1, fieldno2; int f1_is_num, f2_is_num, f1_is_blurred, f2_is_blurred; /* Cache often-used quantities in local variables to help the compiler. */ int ignore_case = (getBitAtPosition (&argl->optmask, _SI_MASK) == BIT_ON); const char** ifs = (const char**)((index1) ? argl->ifs2 : argl->ifs1); const struct numfmt* pnf = (index1) ? &argl->nf2 : &argl->nf1; const unsigned char* ghostmask = (index1) ? argl->ghostmask2 : argl->ghostmask1; const unsigned char* pblurmask = (index1) ? argl->pblurmask2 : argl->pblurmask1; const unsigned char* tblurmask = (index1) ? argl->tblurmask2 : argl->tblurmask1; /* s1 */ const char** Ifs = (const char**)((index2) ? argl->ifs2 : argl->ifs1); const struct numfmt* Pnf = (index2) ? &argl->nf2 : &argl->nf1; const unsigned char* Ghostmask = (index2) ? argl->ghostmask2 : argl->ghostmask1; const unsigned char* Pblurmask = (index2) ? argl->pblurmask2 : argl->pblurmask1; const unsigned char* Tblurmask = (index2) ? argl->tblurmask2 : argl->tblurmask1; /* s2 */ ifs = (!ifs) ? (const char**)def_ifs : ifs; Ifs = (!Ifs) ? (const char**)def_ifs : Ifs; f1 = string_spn (f1, ifs, '\n'); f2 = string_spn (f2, Ifs, '\n'); fieldno1 = fieldno2 = 0; while (*f1 != '\n' && *f2 != '\n') { /* Ignore the fields selected through the option -X */ while ( *f1 != '\n' && fieldno1 < fieldno_upper_limit && (ghostmask[fieldno1 >> 3] & 0x80 >> (fieldno1 & 0x7)) ) { /* First move `f1' to the begin of the next field */ e1 = string_cspn (f1, ifs, '\n'); f1 = string_spn (e1, ifs, '\n'); /* and then increment the field index */ fieldno1++; } if ( fieldno1 >= fieldno_upper_limit ) { fprintf (stderr, _("*** Fatal error occurred in function %s:\n%s"), __FUNCTION__, _("*** a very long line has been encountered which contains\n*** too many fields to be correctly handled\n")); exit (EXIT_TROUBLE); } while ( *f2 != '\n' && fieldno2 < fieldno_upper_limit && (Ghostmask[fieldno2 >> 3] & 0x80 >> (fieldno2 & 0x7)) ) { /* First move `f2' to the begin of the next field */ e2 = string_cspn (f2, Ifs, '\n'); f2 = string_spn (e2, Ifs, '\n'); /* and then increment the field index */ fieldno2++; } if ( fieldno2 >= fieldno_upper_limit ) { fprintf (stderr, _("*** Fatal error occurred in function %s:\n%s"), __FUNCTION__, _("*** a very long line has been encountered which contains\n*** too many fields to be correctly handled\n")); exit (EXIT_TROUBLE); } if (*f1 != '\n' && *f2 != '\n') { /* Find the ends of the fields */ e1 = string_cspn (f1, ifs, '\n'); e2 = string_cspn (f2, Ifs, '\n'); /* Mark the ends of the fields before calling acxnum(). But before doing this, save the original characters placed just after the fields. */ ch1 = *e1; ch2 = *e2; *e1 = *e2 = '\0'; /* Determine the types of the fields */ f1_is_num = acxnum (f1, pnf) >= e1; f2_is_num = acxnum (f2, Pnf) >= e2; /* Determine whether the fields are blurred or not */ f1_is_blurred = (tblurmask[fieldno1 >> 3] & 0x80 >> (fieldno1 & 0x7)) || ((pblurmask[fieldno1 >> 3] & 0x80 >> (fieldno1 & 0x7)) && (f1_is_num)); f2_is_blurred = (Tblurmask[fieldno2 >> 3] & 0x80 >> (fieldno2 & 0x7)) || ((Pblurmask[fieldno2 >> 3] & 0x80 >> (fieldno2 & 0x7)) && (f2_is_num)); if (f1_is_blurred != f2_is_blurred) return 1; else if ((f1_is_blurred)) { /* `f1' and `f2' are both blurred */ *e1 = ch1; *e2 = ch2; } else { /* Neither `f1' nor `f2' is blurred */ if (f1_is_num != f2_is_num) /* If one field is numeric but the other one not, then the two lines are surely different :) */ return 1; else if ( (f1_is_num) ) { /* If both fields are numeric, then perform a reduction to a standard numerical format before the byte-by-byte comparison. */ if ( (compare_numeric_strings (f1, pnf, f2, Pnf)) ) return 1; else { *e1 = ch1; *e2 = ch2; } } else { /* If the fields are not numeric, then go on with byte-by-byte comparison, */ *e1 = ch1; *e2 = ch2; if ((ignore_case)) for (; f1 < e1 && f2 < e2 && TOLOWER(*f1) == TOLOWER(*f2); f1++, f2++); else for (; f1 < e1 && f2 < e2 && *f1 == *f2; f1++, f2++); if (f1 < e1 || f2 < e2) return 1; /* else: We have automatically f1 == e1 && f2 == e2 */ } } /* Move to the next field and increase the field number */ f1 = string_spn (e1, ifs, '\n'); f2 = string_spn (e2, Ifs, '\n'); fieldno1++; fieldno2++; } /* End else --> if (*f1 != '\n' && *f2!= '\n') */ } /* end while (*f1 != '\n' && *f2 != '\n') */ /* Ignore the fields selected through the option -X */ while ( *f1 != '\n' && fieldno1 < fieldno_upper_limit && (ghostmask[fieldno1 >> 3] & 0x80 >> (fieldno1 & 0x7)) ) { /* First move `f1' to the begin of the next field */ e1 = string_cspn (f1, ifs, '\n'); f1 = string_spn (e1, ifs, '\n'); /* and then increment the field index */ fieldno1++; } if ( fieldno1 >= fieldno_upper_limit ) { fprintf (stderr, _("*** Fatal error occurred in function %s:\n%s"), __FUNCTION__, _("*** a very long line has been encountered which contains\n*** too many fields to be correctly handled\n")); exit (EXIT_TROUBLE); } while ( *f2 != '\n' && fieldno2 < fieldno_upper_limit && (Ghostmask[fieldno2 >> 3] & 0x80 >> (fieldno2 & 0x7)) ) { /* First move `f2' to the begin of the next field */ e2 = string_cspn (f2, Ifs, '\n'); f2 = string_spn (e2, Ifs, '\n'); /* and then increment the field index */ fieldno2++; } if ( fieldno2 >= fieldno_upper_limit ) { fprintf (stderr, _("*** Fatal error occurred in function %s:\n%s"), __FUNCTION__, _("*** a very long line has been encountered which contains\n*** too many fields to be correctly handled\n")); exit (EXIT_TROUBLE); } return (*f1 != *f2); } /* Divide SCRIPT into pieces by calling HUNKFUN and print each piece with PRINTFUN. Both functions take one arg, an edit script. HUNKFUN is called with the tail of the script and returns the last link that belongs together with the start of the tail. PRINTFUN takes a subscript which belongs together (with a null link at the end) and prints it. */ void print_script (struct change *script, void (*printfun) (struct change *)) { struct change *next = script; struct change *this; while ((next)) { this = next; /* Disconnect them from the rest of the changes, making them a hunk, and remember the rest for next iteration. */ next = this->link; this->link = 0; #ifdef _DEBUG_SCRIPT_ debug_script (this); #endif /* Print this hunk. */ (*printfun) (this); /* Reconnect the script so it will all be freed properly. */ this->link = next; } } /* Look at a hunk of edit script and report the range of lines in each file that it applies to. HUNK is the start of the hunk, which is a chain of `struct change'. The first and last line numbers of file 0 are stored in *FIRST0 and *LAST0, and likewise for file 1 in *FIRST1 and *LAST1. Note that these are internal line numbers that count from 0. If no lines from file 0 are deleted, then FIRST0 is LAST0+1. Return UNCHANGED if only ignorable lines are inserted or deleted, OLD if lines of file 0 are deleted, NEW if lines of file 1 are inserted, and CHANGED if both kinds of changes are found. */ enum changes analyze_hunk (struct change *hunk, lin *first0, lin *last0, lin *first1, lin *last1) { struct change *next; lin l0, l1; lin show_from, show_to; show_from = show_to = 0; *first0 = hunk->line0; *first1 = hunk->line1; next = hunk; do { l0 = next->line0 + next->deleted - 1; l1 = next->line1 + next->inserted - 1; show_from += next->deleted; show_to += next->inserted; } while ((next = next->link) != 0); *last0 = l0; *last1 = l1; return (show_from ? OLD : UNCHANGED) | (show_to ? NEW : UNCHANGED); } /* Yield a new block of SIZE bytes, initialized to zero. */ void * zalloc (size_t size) { void *p = xmalloc (size); memset (p, 0, size); return p; } #ifdef _DEBUG_SCRIPT_ void debug_script (struct change *sp) { fflush (stdout); for (; sp; sp = sp->link) { long line0 = sp->line0; long line1 = sp->line1; long deleted = sp->deleted; long inserted = sp->inserted; fprintf (stderr, "%3ld %3ld delete %ld insert %ld\n", line0, line1, deleted, inserted); } fflush (stderr); } #endif numdiff-5.9.0/unlocked-io.h0000644000175000017500000000503713054341114015064 0ustar paologpaolog/* Copyright 1992, 1993, 1994, 1997, 1999, 2000, 2001 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef UNLOCKED_IO_H # define UNLOCKED_IO_H 1 # ifndef USE_UNLOCKED_IO # define USE_UNLOCKED_IO 1 # endif # if USE_UNLOCKED_IO /* These are wrappers for functions/macros from GNU libc. The standard I/O functions are thread-safe. These *_unlocked ones are more efficient but not thread-safe. That they're not thread-safe is fine since all of the applications in this package are single threaded. */ # if HAVE_DECL_CLEARERR_UNLOCKED # undef clearerr # define clearerr(x) clearerr_unlocked (x) # endif # if HAVE_DECL_FEOF_UNLOCKED # undef feof # define feof(x) feof_unlocked (x) # endif # if HAVE_DECL_FERROR_UNLOCKED # undef ferror # define ferror(x) ferror_unlocked (x) # endif # if HAVE_DECL_FFLUSH_UNLOCKED # undef fflush # define fflush(x) fflush_unlocked (x) # endif # if HAVE_DECL_FGETS_UNLOCKED # undef fgets # define fgets(x,y,z) fgets_unlocked (x,y,z) # endif # if HAVE_DECL_FPUTC_UNLOCKED # undef fputc # define fputc(x,y) fputc_unlocked (x,y) # endif # if HAVE_DECL_FPUTS_UNLOCKED # undef fputs # define fputs(x,y) fputs_unlocked (x,y) # endif # if HAVE_DECL_FREAD_UNLOCKED # undef fread # define fread(w,x,y,z) fread_unlocked (w,x,y,z) # endif # if HAVE_DECL_FWRITE_UNLOCKED # undef fwrite # define fwrite(w,x,y,z) fwrite_unlocked (w,x,y,z) # endif # if HAVE_DECL_GETC_UNLOCKED # undef getc # define getc(x) getc_unlocked (x) # endif # if HAVE_DECL_GETCHAR_UNLOCKED # undef getchar # define getchar() getchar_unlocked () # endif # if HAVE_DECL_PUTC_UNLOCKED # undef putc # define putc(x,y) putc_unlocked (x,y) # endif # if HAVE_DECL_PUTCHAR_UNLOCKED # undef putchar # define putchar(x) putchar_unlocked (x) # endif # endif /* USE_UNLOCKED_IO */ #endif /* UNLOCKED_IO_H */ numdiff-5.9.0/BUGS0000644000175000017500000000166713054341114013172 0ustar paologpaologBug reports have to be sent to the address . Please, put Numdiff in the subject and indicate the version of the operating system you are running (in particular, do not forget to specify if it is a 32- or a 64-bit system), and, if you know it, the version of the compiler used to build Numdiff. Please write also whether your version of Numdiff uses the GNU MP library or not. Before writing an email be sure to run the latest stable version of Numdiff, I do not provide support for older versions. ------------------------------------------------------------------------------- Known issues ============ Numdiff cannot be successfully installed if the target directory chosen for the installation is a directory whose path includes one or more spaces. This is not an issue of Numdiff but of GNU shtool, which is used to perform the installation in a portable way. Thanks to Tim Jenness for having reported this problem. numdiff-5.9.0/bitvector.h0000444000175000017500000001551013054341114014647 0ustar paologpaolog/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef _BITVECTOR_H_ #define _BITVECTOR_H_ #include // for FILE enum { BIT_ERR = -1, BIT_OFF = 0, BIT_ON = 1, NBITS_PER_BYTE = 8 }; typedef unsigned char byte_t; struct _bitvector { byte_t *ptr; // Pointer to a dynamic array size_t sz; // This is the size in bytes of the array pointed to by PTR }; typedef struct _bitvector bitvector; /* WARNING: If a memory allocation fails when creating a new bitvector or when enlarging an existing one, the program in execution is terminated via exit(EXIT_FAILURE) after printing a suitable Out-of-memory message to stderr. */ /* Return a bitvector whose size in bits is greater or equal than REQUESTEDSIZE or, in case of out of memory, a bit vector of size zero whose PTR field is the null pointer. Remarks: 1. The bits of the bitvector are all set to zero before the function returns. 2. If REQUESTEDSIZE is zero, then a bitvector with null fields (PTR and SZ) is returned. */ bitvector newBitVector (size_t requestedSize); /* If BV is not null, return the size in bits of the bitvector pointed to by BV, otherwise return (size_t)(-1). */ size_t getBitVectorSize (const bitvector* bv); /* If BV or BV->PTR is the null pointer, or if POS is greater or equal than the size in bits of the bitvector pointed to by BV, return BIT_ERR. Otherwise, return the value of the bit at position POS in the bitvector pointed to by BV, which is either BIT_OFF or BIT_ON. */ int getBitAtPosition (const bitvector* bv, size_t pos); /* If BV or BV->PTR is the null pointer, or ENDPOS <= STARTPOS, or STARTPOS >= getBitVectorSize(BV), return the null pointer, i.e. (int*)0. Otherwise, return the bits from the bitvector pointed to by BV lying in the range [STARTPOS, ENDPOS) (i.e. bit at STARTPOS included, bit at ENDPOS excluded) in the form of a (dynamic) array of integers. Remarks: 1. If the returned pointer is not null, it will always point to an array of ENDPOS - STARTPOS elements. In case ENDPOS > getBitVectorSize(BV), the last ENDPOS - getBitVectorSize(BV) elements of the array will be equal to BIT_ERR. 2. Once the returned array is not any longer needed, the memory allocated for it should be freed to avoid memory leaks. */ int* getBitsInRange (const bitvector* bv, size_t startpos, size_t endpos); /* If BV is not the null pointer, set the bit at position POS of the bitvector pointed to by BV to the given VALUE. VALUE should be zero for OFF, non-zero for ON. Remark: If POS is greater or equal than the size in bits of the bitvector, then the bitvector is first enlarged (through a call to realloc()) to be able to host at least POS+1 bits. The newly allocated bits are then set to zero, and finally the bit at position POS is set to VALUE. */ void setBitAtPosition (bitvector* bv, size_t pos, int value); /* If BV is not the null pointer, among the bits of the bitvector pointed to by BV set those ones lying in the range [STARTPOS, ENDPOS) (i.e. bit at STARTPOS included, bit at ENDPOS excluded) to the values specified in the array of integers pointed to by VARRAY. Remarks: 1. No action is performed if STARTPOS >= ENDPOS. 2. If ENDPOS is larger than the size in bits of the bitvector, then the bitvector is first enlarged (through a call to realloc()) to be able to host at least ENDPOS bits. The newly allocated bits are then set to zero, and finally the bits in the range [STARTPOS, ENDPOS) are set accordingly to the values found in the array of integers pointed to by VARRAY. 3. VARRAY should point to an array of size >= ENDPOS-STARTPOS, otherwise a buffer overrun with possible crash of the calling program will occur. */ void setBitsInRange (bitvector* bv, size_t startpos, size_t endpos, const int* varray); /* If BV is not the null pointer, among the bits of the bitvector pointed to by BV set those ones lying in the range [STARTPOS, ENDPOS) (i.e. bit at STARTPOS included, bit at ENDPOS excluded) to the given VALUE. VALUE should be zero for OFF, non-zero for ON. Remarks: 1. No action is performed if STARTPOS >= ENDPOS. 2. If ENDPOS is larger than the size in bits of the bitvector, then the bitvector is first enlarged (through a call to realloc()) to be able to host at least ENDPOS bits. The newly allocated bits are then set to zero, and finally the bits in the range [STARTPOS, ENDPOS) are set accordingly to VALUE. */ void setBitsInRangeToValue (bitvector* bv, size_t startpos, size_t endpos, int value); /* If MIN is the minimum between ENDPOS and BV->SZ * NBITS_PER_BYTE, flip all bits in the range [STARTPOS, MIN) (i.e. bit at STARTPOS included, bit at MIN excluded): all instances of true (1) become false (0), and all instances of false become true. Return the number of bits actually flipped. Remark: if BV == NULL, BV->PTR == NULL, or STARTPOS >= BV->SZ * NBITS_PER_BYTE, then no bit is flipped and zero is returned. */ size_t flipBitsInRange (bitvector* bv, size_t startpos, size_t endpos); /* If BV == NULL, BV->PTR == NULL, or BV->SZ is zero, then just return zero. Otherwise, print to the file pointed to by FP the contents of the bitvector pointed to by BV. In this last case, the returned value shall be the number of bits successfully printed (as '0' or '1') to the file pointed to by FP. If this number is less than BV->SZ * NBITS_PER_BYTE, then an I/O error occurred. Remark: The contents of the bitvector shall be printed in such a way that the leftmost character will represent the highest bit, the rightmost character the lowest bit. */ size_t printBitVectorOn (const bitvector* bv, FILE* fp); /* If BV and BV->PTR are not null pointers, then free the memory pointed to by BV->PTR and set BV->SZ to zero. */ void emptyBitVector (bitvector* bv); #endif /* _BITVECTOR_H_ */ numdiff-5.9.0/options.c0000444000175000017500000011224513054341114014337 0ustar paologpaolog/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #define GDIFF_OPTIONS 1 /* Leave this inclusion at the begin, otherwise problems */ /* with the symbol __USE_FILE_OFFSET64 */ #include"numdiff.h" #include #include #include #include #include #include"getopt.h" #include"error.h" #include"linesplit.h" #include"xalloc.h" #ifdef _DMALLOC_ #include /* Useful only for the debugging */ #endif void print_version (const char* progname) { printf ("%s %s\n", progname, VERSION); printf ("Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 %s \n", /* TRANSLATORS: This is a proper name. See the gettext manual, section Names. Pronounciation is like "evaa-no pree-me". */ _("Ivano Primi")); printf (_("\ License GPLv3+: GNU GPL version 3 or later,\n\ see .\n\ This is free software: you are free to change and redistribute it.\n\ There is NO WARRANTY, to the extent permitted by law.\n")); #ifdef USE_GMP printf ("\n%s %s.\n", _("The software has been linked against\n\ the GNU Multiple Precision Arithmetic Library,\n\ version number"), gmp_version); #else /* not USE_GMP */ printf ("\n%s.\n", _("The software has been built with\n\ its own internal support for multiple precision arithmetic")); #endif /* not USE_GMP */ } void print_help (const char* progname) { puts (_("Usage:")); printf ("%s -h|--help|-v|--version %s\n\n", progname, _("or")); printf ("%s %s\n", progname, "[-s IFS][-D DELIMS][-a THRVAL[:RANGE|:RANGE1:RANGE2]][-r THRVAL[:RANGE|:RANGE1:RANGE2]][-2][-F NUM][-# NUM][-P][-N][-I][-c CURRNAME][-d C1C2][-t C1C2][-g N1N2][-p C1C2][-n C1C2][-e C1C2][-i C1C2][-X 1:RANGE][-X 2:RANGE][-E][-U][-b][-V][-O[NUM]][--raw][-q][-S][-z 1:RANGE][-z 2:RANGE][-Z 1:RANGE][-Z 2:RANGE][-m][-H][-f[NUM]][-T][-B][-l PATH][-o PATH] FILE1 FILE2"); printf (_("\nCompare putatively similar files line by line and field by field,\nignoring small numeric differences or/and different numeric formats.\n\n")); printf (_("RANGE, RANGE1 and RANGE2 stay for a positive integer value or\nfor a range of integer values, like 1-, 3-5 or -7.\n")); printf ("%s\n%s\n%s\n\n%s\n\n", _("The two arguments after the options are the names of the files to compare."), _("The complete paths of the files should be given,\na directory name is not accepted."), _("The given paths cannot refer to the same file\nbut one of them can be \"-\", which refers to stdin."), _("Exit status: 1 if files differ, 0 if they are equal, -1 (255) in case of error")); /* %%% */ printf ("-s, --separators=IFS\n %s\n %s\n %s\n", _("Specify the set of characters to use as delimiters\n while splitting the input lines into fields"), _("(The default set of delimiters is space, tab and newline)."), _("If IFS is prefixed with 1: or 2:, use the given delimiter set\n only for the lines from the first or the second file respectively")); printf ("-D, --delimiters=DELIMS\n %s\n %s\n %s\n", _("Specify the set of strings to use as delimiters\n while splitting the input lines into fields"), _("(The default set of delimiters is space, tab and newline)."), _("If DELIMS is prefixed with 1: or 2:, use the given delimiter set\n only for the lines from the first or the second file respectively")); printf ("-a, --absolute-tolerance=THRVAL[:RANGE|:RANGE1:RANGE2]\n %s\n %s\n %s\n", _("Set to THRVAL the maximum absolute difference permitted\n before two numeric fields are regarded as different\n (The default value is zero)."), _("If a RANGE is given, use the specified\n threshold only when comparing fields whose positions lie in RANGE."), _("If both RANGE1 and RANGE2 are given and have the same length,\n then use the specified threshold when comparing a field of FILE1\n lying in RANGE1 with the corresponding field of FILE2 in RANGE2")); printf ("-r, --relative-tolerance=THRVAL[:RANGE|:RANGE1:RANGE2]\n %s\n %s\n %s\n", _("Set to THRVAL the maximum relative difference permitted\n before two numeric fields are regarded as different\n (The default value is zero)."), _("If a RANGE is given, use the specified\n threshold only when comparing fields whose positions lie in RANGE."), _("If both RANGE1 and RANGE2 are given and have the same length,\n then use the specified threshold when comparing a field of FILE1\n lying in RANGE1 with the corresponding field of FILE2 in RANGE2")); printf ("-2, --strict\n %s\n", _("Consider two numerical values as equal only if\n both absolute and relative difference do not exceed\n the respective tolerance threshold")); printf ("-F, --formula=NUM\n %s\n %s\n %s\n %s\n", _("Use the formula indicated by NUM to compute the relative errors."), _("If \'NUM\' is 0 use the classic formula."), _("If \'NUM\' is 1 compute the relative errors by considering\n the values in FILE1 as sample values."), _("If \'NUM\' is 2 compute the relative errors by considering\n the values in FILE2 as sample values.")); printf ("-#, --digits=NUM\n %s\n", _("Set to NUM the number of digits in the significands\n used in multiple precision arithmetic")); printf ("-P, --positive-differences\n %s\n", _("Ignore all differences due to numeric fields of the second file that\n are less than the corresponding numeric fields in the first file")); printf ("-N, --negative-differences\n %s\n", _("Ignore all differences due to numeric fields of the second file that\n are greater than the corresponding numeric fields in the first file")); printf ("-I, --ignore-case\n %s\n", _("Ignore changes in case while doing literal comparisons")); printf ("-c, --currency=CURRNAME\n %s\n %s\n", _("Set to CURRNAME the currency name for the two files to compare."), _("CURRNAME must be prefixed with 1: or 2: to specify the\n currency name only for the first or the second file")); printf ("-d, --decimal-point=C1C2\n %s\n", _("Specify the characters representing the decimal point\n in the two files to compare")); printf ("-t, --thousands-separator=C1C2\n %s\n", _("Specify the characters representing the thousands separator\n in the two files to compare")); printf ("-g, --group-length=N1N2\n %s\n", _("Specify the number of digits forming each group of thousands\n in the two files to compare")); printf ("-p, --plus-prefix=C1C2\n %s\n", _("Specify the (optional) prefixes for positive values\n used in the two files to compare")); printf ("-n, --minus-prefix=C1C2\n %s\n", _("Specify the prefixes for negative values\n used in the two files to compare")); printf ("-e, --exponent-letter=C1C2\n %s\n", _("Specify the exponent letters\n used in the two files to compare")); printf ("-i, --imaginary-unit=C1C2\n %s\n", _("Specify the characters representing the imaginary unit\n in the two files to compare")); printf ("-X, --exclude=1:RANGE\n %s\n", _("Select the fields of the first file that have to be ignored")); printf ("-X, --exclude=2:RANGE\n %s\n", _("Select the fields of the second file that have to be ignored")); printf ("-E, --essential\n %s\n", _("While printing the differences between the two compared files\n show only the numerical ones")); printf ("-U, --dummy\n %s\n", _("While printing the differences between the two compared files\n neglect all the numerical ones (dummy mode)")); printf ("-b, --brief\n %s\n", _("Suppress all messages concerning the differences discovered\n in the structures of the two files")); printf ("-V, --verbose\n %s\n", _("For every couple of lines which differ in at least one field print\n an header to show how these lines appear in the two compared files")); printf ("-O, --overview[=NUM]\n %s\n %s\n %s\n %s\n", _("Display a side by side difference listing of the two files\n showing which lines are present only in one file, which\n lines are present in both files but with one or more differing fields,\n and which lines are identical."), _("If \'NUM\' is zero or is not specified, output at most 130 columns per line."), _("If \'NUM\' is a positive number, output at most \'NUM\' columns per line."), _("If \'NUM\' is a negative number, do not output common lines\n and display at most -\'NUM\' columns per line.")); printf ("--raw\n %s\n", _("Display the differences between the two compared files\n in raw format (not very convenient for humans)")); printf ("-q, --quiet, --silent\n %s\n", _("Suppress all the standard output")); printf ("-S, --statistics\n %s\n", _("Add some statistics to the standard output")); printf ("-z, --blur-if-numerical=1:RANGE\n %s\n", _("Select the fields of the first file that have to be\n blurred during the synchronization procedure\n only if they turn out to be numeric")); printf ("-z, --blur-if-numerical=2:RANGE\n %s\n", _("Select the fields of the second file that have to be\n blurred during the synchronization procedure\n only if they turn out to be numeric")); printf ("-Z, --blur-unconditionally=1:RANGE\n %s\n", _("Select the fields of the first file that have to be\n unconditionally blurred during the synchronization procedure")); printf ("-Z, --blur-unconditionally=2:RANGE\n %s\n", _("Select the fields of the second file that have to be\n unconditionally blurred during the synchronization procedure")); printf ("-m, --minimal\n %s\n", _("During synchronization try hard to find a smaller set of changes")); printf ("-H, --speed-large-files\n %s\n", _("During synchronization assume large files and\n many scattered small changes")); printf ("-f, --test-filter[=NUM]\n %s\n %s\n %s\n %s\n", _("Run only the filter and then show the results of its\n attempt to synchronize the two files."), _("If \'NUM\' is zero or is not specified, output at most 130 columns per line."), _("If \'NUM\' is a positive number, output at most \'NUM\' columns per line."), _("If \'NUM\' is a negative number, do not output common lines\n and display at most -\'NUM\' columns per line.")); printf ("-T, --expand-tabs\n %s\n", _("Expand tabs to spaces in output while displaying the results of the\n synchronization procedure (meaningful only together with option -O or -f)")); printf ("-B, --binary\n %s\n", _("Treat both files as binary files (only meaningful under Doz/Windoz)")); printf ("-l, --warnings-to=PATH\n %s\n", _("Redirect warning and error messages from stderr to the indicated file")); printf ("-o, --output=PATH\n %s\n", _("Redirect output from stdout to the indicated file")); printf ("-h, --help\n %s\n", _("Show help message and predefined settings")); printf ("-v, --version\n %s\n", _("Show version number, Copyright, Distribution Terms and NO-Warranty")); /* %%% */ puts (_("\n Default numeric format (for both files to compare):\n")); printf (_("Currency name = \"%s\"\n"), CURRENCY); printf (_("Decimal point = `%c\'\n"), DP); printf (_("Thousands separator = `%c\'\n"), THSEP); printf (_("Number of digits in each thousands group = %u\n"), GROUPING); printf (_("Leading positive sign = `%c\'\n"), POS_SIGN); printf (_("Leading negative sign = `%c\'\n"), NEG_SIGN); printf (_("Prefix for decimal exponent = `%c\'\n"), ECH); printf (_("Symbol used to denote the imaginary unit = `%c\'\n\n"), IU); } static int nfset (int opt_ch, const char* opt_arg, argslist* arg_list) { if (strlen(opt_arg) <= 2) { char _1st = *opt_arg, _2nd = *(opt_arg+1); switch (opt_ch) { case 'd': if ( (is_punct(_1st)) && (_2nd == '\0' || is_punct(_2nd)) ) { setBitAtPosition (&arg_list->optmask, _D_MASK, BIT_ON); arg_list->nf1.dp = _1st; arg_list->nf2.dp = (_2nd) ? _2nd : _1st; return 0; } break; case 't': if ( (is_punct(_1st)) && (_2nd == '\0' || is_punct(_2nd)) ) { setBitAtPosition (&arg_list->optmask, _T_MASK, BIT_ON); arg_list->nf1.thsep = _1st; arg_list->nf2.thsep = (_2nd) ? _2nd : _1st; return 0; } break; case 'e': if ( is_print(_1st) && (_2nd == '\0' || is_print(_2nd)) ) { setBitAtPosition (&arg_list->optmask, _E_MASK, BIT_ON); arg_list->nf1.ech = _1st; arg_list->nf2.ech = (_2nd) ? _2nd : _1st; return 0; } break; case 'n': if ( is_print(_1st) && (_2nd == '\0' || is_print(_2nd)) ) { setBitAtPosition (&arg_list->optmask, _N_MASK, BIT_ON); arg_list->nf1.neg_sign = _1st; arg_list->nf2.neg_sign = (_2nd) ? _2nd : _1st; return 0; } break; case 'i': if ( is_print(_1st) && (_2nd == '\0' || is_print(_2nd)) ) { setBitAtPosition (&arg_list->optmask, _I_MASK, BIT_ON); arg_list->nf1.iu = _1st; arg_list->nf2.iu = (_2nd) ? _2nd : _1st; return 0; } break; case 'p': if ( is_print(_1st) && (_2nd == '\0' || is_print(_2nd)) ) { setBitAtPosition (&arg_list->optmask, _P_MASK, BIT_ON); arg_list->nf1.pos_sign = _1st; arg_list->nf2.pos_sign = (_2nd) ? _2nd : _1st; return 0; } break; case 'g': if ( (is_digit(_1st)) && (_2nd == '\0' || is_digit(_2nd)) ) { setBitAtPosition (&arg_list->optmask, _G_MASK, BIT_ON); arg_list->nf1.grouping = _1st - '0'; arg_list->nf2.grouping = (_2nd) ? _2nd - '0': _1st - '0'; return 0; } break; } } return -1; } static int fselect (const char* str, unsigned char* mask, int mask_size) { long beg, end; unsigned long n; char *ptr, *endptr; beg = end = -1; if (!str || !*str) return 0; /* no field selected */ /* If we arrive here we are sure that *str != '\0' ! */ if ( strcmp (str, "@") == 0 ) { /* select all fields */ for (mask_size /= 8; mask_size > 0; mask_size--, mask[mask_size] = 0xFF); return 1; } if ((beg = strtol (str, &endptr, 10)) == 0 || beg > mask_size || beg < -mask_size) return -1; /* illegal input */ else if (beg < 0) { if (*endptr == '\0') { end = -beg; beg = 1; } else return -1; } else if (*endptr == '\0') end = beg; else if (*endptr == '-') { if (*(ptr = endptr + 1) == '\0') end = mask_size; else { if ((end = strtol (ptr, &endptr, 10)) <= 0 || *endptr != '\0' || end > mask_size) return -1; /* illegal input */ } } if (beg > end) return -1; else { /* Remark: internally the field numbers start from zero, not from one */ for (n = beg - 1; n <= end - 1; n++) mask[n >> 3] |= 0x80 >> (n & 0x7); return 1; } } #define VALID_NUMFMT 0 #define INVALID_NUMFMT -1 #define INVALID_CURRENCY -2 static int is_numfmt_valid (const struct numfmt* pnf) { char store[NUMFMT_CHARS]; char *ptr; int i, j; for (ptr = pnf->currency; *ptr != '\0' && (!is_digit(*ptr)) && *ptr != pnf->dp && *ptr != pnf->thsep && *ptr != pnf->pos_sign && *ptr != pnf->neg_sign; ptr++); if (*ptr != '\0') return INVALID_CURRENCY; store[0] = pnf->dp; store[1] = pnf->thsep; store[2] = pnf->pos_sign; store[3] = pnf->neg_sign; store[4] = pnf->ech; store[5] = pnf->iu; for (i=0; i < NUMFMT_CHARS; i++) { for (j = i+1; j < NUMFMT_CHARS; j++) if (store[i] == store[j]) return INVALID_NUMFMT; } return VALID_NUMFMT; } extern int optind; int setargs (int argc, char* argv[], argslist *list) { const int mask_size = FIELDMASK_SIZE*8; const char *optstring = "h2F:bBVO::qUESIPNz:Z:mHT#:s:D:a:r:c:d:t:g:p:n:e:i:f::X:l:o:v"; struct option long_options[] = { {"help", 0, NULL, 'h'}, {"strict", 0, NULL, '2'}, {"formula", 1, NULL, 'F'}, {"brief", 0, NULL, 'b'}, {"binary", 0, NULL, 'B'}, {"verbose", 0, NULL, 'V'}, {"overview", 2, NULL, 'O'}, {"quiet", 0, NULL, 'q'}, {"silent", 0, NULL, 'q'}, {"dummy", 0, NULL, 'U'}, {"essential", 0, NULL, 'E'}, {"statistics", 0, NULL, 'S'}, {"ignore-case", 0, NULL, 'I'}, {"positive-differences", 0, NULL, 'P'}, {"negative-differences", 0, NULL, 'N'}, {"blur-if-numerical", 1, NULL, 'z'}, {"blur-unconditionally", 1, NULL, 'Z'}, {"minimal", 0, NULL, 'm'}, {"speed-large-files", 0, NULL, 'H'}, {"expand-tabs", 0, NULL, 'T'}, {"digits", 1, NULL, '#'}, {"separators", 1, NULL, 's'}, {"delimiters", 1, NULL, 'D'}, {"absolute-tolerance", 1, NULL, 'a'}, {"relative-tolerance", 1, NULL, 'r'}, {"currency", 1, NULL, 'c'}, {"decimal-point", 1, NULL, 'd'}, {"thousands-separator", 1, NULL, 't'}, {"group-length", 1, NULL, 'g'}, {"plus-prefix", 1, NULL, 'p'}, {"minus-prefix", 1, NULL, 'n'}, {"exponent-letter", 1, NULL, 'e'}, {"imaginary-unit", 1, NULL, 'i'}, {"test-filter", 2, NULL, 'f'}, {"exclude", 1, NULL, 'X'}, {"warnings-to", 1, NULL, 'l'}, {"output", 1, NULL, 'o'}, {"raw", 0, NULL, 1000}, {"version", 0, NULL, 'v'}, {0, 0, 0, 0} }; int option_index=0; char *tail; int cmpRes, optch, off, rv; unsigned int t, file_id; long w = DEF_ATMOST_NCOLS; unsigned char *bitmask; while ( (optch = getopt_long (argc, argv, optstring, long_options, &option_index)) != -1 ) { switch (optch) { case 'h': setBitAtPosition (&list->optmask, _H_MASK, BIT_ON); break; case '2': setBitAtPosition (&list->optmask, _2_MASK, BIT_ON); break; case 'F': setBitAtPosition (&list->optmask, _SF_MASK, BIT_ON); if (strncmp ("0", optarg, 1) == 0) list->relerr_formula = CLASSIC_FORMULA; else if (strncmp ("1", optarg, 1) == 0) list->relerr_formula = WR_TO_FIRST_FILE; else if (strncmp ("2", optarg, 1) == 0) list->relerr_formula = WR_TO_SECOND_FILE; else { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } break; case 'b': setBitAtPosition (&list->optmask, _B_MASK, BIT_ON); break; case 'B': setBitAtPosition (&list->optmask, _SB_MASK, BIT_ON); binary = 1; break; case 'V': setBitAtPosition (&list->optmask, _SV_MASK, BIT_ON); break; case 'q': setBitAtPosition (&list->optmask, _Q_MASK, BIT_ON); break; case 'U': setBitAtPosition (&list->optmask, _SU_MASK, BIT_ON); break; case 'E': setBitAtPosition (&list->optmask, _SE_MASK, BIT_ON); break; case 'S': setBitAtPosition (&list->optmask, _SS_MASK, BIT_ON); break; case 'I': setBitAtPosition (&list->optmask, _SI_MASK, BIT_ON); break; case 'P': setBitAtPosition (&list->optmask, _SP_MASK, BIT_ON); list->flag = 1; break; case 'N': setBitAtPosition (&list->optmask, _SN_MASK, BIT_ON); list->flag = -1; break; case 'z': if ( (cmpRes = strncmp (optarg, "1:", 2)) && (strncmp (optarg, "2:", 2)) ) { /* None of the prefixes 1: and 2: has been used, then we have to select fields for both files */ if (fselect (optarg, list->pblurmask1, mask_size) <= 0) { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } else { fselect (optarg, list->pblurmask2, mask_size); setBitAtPosition (&list->optmask, _Z_MASK, BIT_ON); } } else { bitmask = (cmpRes == 0 ? list->pblurmask1 : list->pblurmask2); if (fselect (optarg+2, bitmask, mask_size) <= 0) { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } else setBitAtPosition (&list->optmask, _Z_MASK, BIT_ON); } break; case 'Z': if ( (cmpRes = strncmp (optarg, "1:", 2)) && (strncmp (optarg, "2:", 2)) ) { /* None of the prefixes 1: and 2: has been used, then we have to select fields for both files */ if (fselect (optarg, list->tblurmask1, mask_size) <= 0) { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } else { fselect (optarg, list->tblurmask2, mask_size); setBitAtPosition (&list->optmask, _SZ_MASK, BIT_ON); } } else { bitmask = (cmpRes == 0 ? list->tblurmask1 : list->tblurmask2); if (fselect (optarg+2, bitmask, mask_size) <= 0) { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } else setBitAtPosition (&list->optmask, _SZ_MASK, BIT_ON); } break; case 'm': setBitAtPosition (&list->optmask, _M_MASK, BIT_ON); break; case 'H': setBitAtPosition (&list->optmask, _SH_MASK, BIT_ON); speed_large_files = 1; break; case 'T': setBitAtPosition (&list->optmask, _ST_MASK, BIT_ON); expand_tabs = 1; break; case '#': list->iscale = strtol (optarg, &tail, 10); if (*tail != '\0' || list->iscale < 0 || list->iscale > MAX_ISCALE) { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } else setBitAtPosition (&list->optmask, _X_MASK, BIT_ON); break; case 's': if (*optarg == '1' && *(optarg+1) == ':') { if ((list->ifs1)) { delete_string_vector (list->ifs1); list->ifs1 = NULL; } list->ifs1 = ssplit_former_way (optarg+2); if (!list->ifs1) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE); return -1; } } else if (*optarg == '2' && *(optarg+1) == ':') { if ((list->ifs2)) { delete_string_vector (list->ifs2); list->ifs2 = NULL; } list->ifs2 = ssplit_former_way (optarg+2); if (!list->ifs2) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE); return -1; } } else { if ((list->ifs1)) { delete_string_vector (list->ifs1); list->ifs1 = NULL; } if ((list->ifs2)) { delete_string_vector (list->ifs2); list->ifs2 = NULL; } list->ifs1 = ssplit_former_way (optarg); list->ifs2 = ssplit_former_way (optarg); if (!list->ifs1 || !list->ifs2) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE); return -1; } } if ( ((list->ifs1) && !is_string_in_vector(NEWLINE_STR, (const char**) list->ifs1)) || ((list->ifs2) && !is_string_in_vector(NEWLINE_STR, (const char**) list->ifs2)) ) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE, optch); fprintf (stderr, _(" The list of field delimiters can not be empty and\n must always include the newline character (\'\\n\')\n")); return -1; } else { remove_duplicates_from_string_vector (list->ifs1); remove_duplicates_from_string_vector (list->ifs2); sort_string_vector (list->ifs1); /* This is not strictly necessary */ sort_string_vector (list->ifs2); /* This is not strictly necessary */ setBitAtPosition (&list->optmask, _S_MASK, BIT_ON); } break; case 'D': if (*optarg == '1' && *(optarg+1) == ':') { if ((list->ifs1)) { delete_string_vector (list->ifs1); list->ifs1 = NULL; } list->ifs1 = ssplit (optarg+2, I_DEF_SEP); if (!list->ifs1) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE); return -1; } } else if (*optarg == '2' && *(optarg+1) == ':') { if ((list->ifs2)) { delete_string_vector (list->ifs2); list->ifs2 = NULL; } list->ifs2 = ssplit (optarg+2, I_DEF_SEP); if (!list->ifs2) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE); return -1; } } else { if ((list->ifs1)) { delete_string_vector (list->ifs1); list->ifs1 = NULL; } if ((list->ifs2)) { delete_string_vector (list->ifs2); list->ifs2 = NULL; } list->ifs1 = ssplit (optarg, I_DEF_SEP); list->ifs2 = ssplit (optarg, I_DEF_SEP); if (!list->ifs1 || !list->ifs2) { fprintf (stderr, _("%s: memory exhausted\n"), PACKAGE); return -1; } } if ( ((list->ifs1) && is_char_in_vector(NEWLINE, (const char**) list->ifs1) != 1) || ((list->ifs2) && is_char_in_vector(NEWLINE, (const char**) list->ifs2) != 1) ) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE, optch); fprintf (stderr, _(" The list of field delimiters cannot be empty and\n must always include the newline string (\"\\n\").\n Care that the newline character cannot appear\n in any other delimiter than the newline string\n")); return -1; } else { remove_duplicates_from_string_vector (list->ifs1); remove_duplicates_from_string_vector (list->ifs2); sort_string_vector (list->ifs1); sort_string_vector (list->ifs2); setBitAtPosition (&list->optmask, _SD_MASK, BIT_ON); } break; case 'a': rv = thrlist_add (&list->maxabserr, optarg); if (rv == THRLIST_INVALID_FORMAT) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE, optch); fprintf (stderr, _(" The format specification has not been respected\n")); return -1; } else if (rv == THRLIST_INVALID_RANGES) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE, optch); fprintf (stderr, _(" The specified ranges do not have the same length\n")); return -1; } else setBitAtPosition (&list->optmask, _A_MASK, BIT_ON); break; case 'r': rv = thrlist_add (&list->maxrelerr, optarg); if (rv == THRLIST_INVALID_FORMAT) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE, optch); fprintf (stderr, _(" The format specification has not been respected\n")); return -1; } else if (rv == THRLIST_INVALID_RANGES) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE, optch); fprintf (stderr, _(" The specified ranges do not have the same length\n")); return -1; } else setBitAtPosition (&list->optmask, _R_MASK, BIT_ON); break; case 'c': file_id = 0x0; if (*optarg == '1' && *(optarg+1) == ':') { if ((list->nf1.currency)) free((void*)list->nf1.currency); list->nf1.currency = get_separating_string (optarg+2); file_id = 0x1; } else if (*optarg == '2' && *(optarg+1) == ':') { if ((list->nf2.currency)) free((void*)list->nf2.currency); list->nf2.currency = get_separating_string (optarg+2); file_id = 0x2; } else { if ((list->nf1.currency)) free((void*)list->nf1.currency); list->nf1.currency = get_separating_string (optarg); if ((list->nf2.currency)) free((void*)list->nf2.currency); list->nf2.currency = get_separating_string (optarg); file_id = 0x3; } if ( (strlen(list->nf1.currency) == 0 && ((file_id & 0x3) == 0x1)) || (strlen(list->nf2.currency) == 0 && ((file_id & 0x3) == 0x2)) ) { fprintf (stderr, _("%s: invalid argument after `-%c\' option:\n"), PACKAGE, optch); fprintf (stderr, _(" you have missed to specify the currency name\n")); return -1; } setBitAtPosition (&list->optmask, _C_MASK, BIT_ON); break; case 'd': case 't': case 'g': case 'p': case 'n': case 'e': case 'i': if (nfset (optch, optarg, list) < 0) { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } break; case 'f': case 'O': if (getBitAtPosition (&list->optmask, _F_MASK) == BIT_OFF && getBitAtPosition (&list->optmask, _SO_MASK) == BIT_OFF) { if(!optarg) { /* There is no optional argument, then set */ /* 'w' to 'DEF_ATMOST_NCOLS'. */ if (optch == 'f') setBitAtPosition (&list->optmask, _F_MASK, BIT_ON); else setBitAtPosition (&list->optmask, _SO_MASK, BIT_ON); w = DEF_ATMOST_NCOLS; } else { /* An argument follows */ w = strtol (optarg, &tail, 10); /* If the argument of the option is not a valid number, */ /* then exit after printing a suitable error message. */ if (*tail != '\0') { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } else { if (optch == 'f') setBitAtPosition (&list->optmask, _F_MASK, BIT_ON); else setBitAtPosition (&list->optmask, _SO_MASK, BIT_ON); } /* Otherwise you have to set 'w' appropriately. */ /* If the given argument is less than -MAX_ATMOST_NCOLS */ /* then set 'w' to 'DEF_ATMOST_NCOLS' and 'suppress_common_lines' to 'TRUE'. */ if (w < -MAX_ATMOST_NCOLS) { w = DEF_ATMOST_NCOLS; suppress_common_lines = 1; } /* If the argument were negative, then remove the sign */ /* and set 'suppress_common_lines' to 'TRUE'. */ if (w < 0) { w *= -1; suppress_common_lines = 1; } /* If the given argument is too small or too big in absolute value, */ /* then set 'w' to 'DEF_ATMOST_NCOLS'. */ if (w < MIN_ATMOST_NCOLS || w > MAX_ATMOST_NCOLS) w = DEF_ATMOST_NCOLS; /* Otherwise leave 'w' set to the value of the argument. */ } /* end optarg != 0 */ } break; case 'X': if ( (cmpRes = strncmp (optarg, "1:", 2)) && (strncmp (optarg, "2:", 2)) ) { /* None of the prefixes 1: and 2: has been used, then we have to select fields for both files */ if (fselect (optarg, list->ghostmask1, mask_size) <= 0) { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } else { fselect (optarg, list->ghostmask2, mask_size); setBitAtPosition (&list->optmask, _SX_MASK, BIT_ON); } } else { bitmask = (cmpRes == 0 ? list->ghostmask1 : list->ghostmask2); if (fselect (optarg+2, bitmask, mask_size) <= 0) { fprintf (stderr, _("%s: invalid argument after `-%c\' option\n"), PACKAGE, optch); return -1; } else setBitAtPosition (&list->optmask, _SX_MASK, BIT_ON); } break; case 'l': if (!freopen (optarg, "w", stderr)) { fprintf (stderr, _("%s: cannot open file \"%s\":\n"), PACKAGE, optarg); perror(0); return -1; } setBitAtPosition (&list->optmask, _L_MASK, BIT_ON); break; case 'o': if (!freopen (optarg, "w", stdout)) { fprintf (stderr, _("%s: cannot open file \"%s\":\n"), PACKAGE, optarg); perror(0); return -1; } setBitAtPosition (&list->optmask, _O_MASK, BIT_ON); break; case 1000: setBitAtPosition (&list->optmask, _RAW_MASK, BIT_ON); break; case 'v': setBitAtPosition (&list->optmask, _V_MASK, BIT_ON); break; default: /* fprintf (stderr, _("%s: unrecognized option `-%c\' \n"), PACKAGE, optch); */ return -1; } } t = expand_tabs ? 1 : TAB_WIDTH; off = (w + t + 3) / (2 * t) * t; sdiff_half_width = MAX (0, MIN (off - 3, w - off)), sdiff_column2_offset = sdiff_half_width ? off : w; if (getBitAtPosition (&list->optmask, _SV_MASK) == BIT_ON) list->output_mode = OUTMODE_VERBOSE; if (getBitAtPosition (&list->optmask, _B_MASK) == BIT_ON) list->output_mode = OUTMODE_BRIEF; if (getBitAtPosition (&list->optmask, _B_MASK) == BIT_ON && getBitAtPosition (&list->optmask, _SV_MASK) == BIT_ON) list->output_mode = OUTMODE_COINCISE; if (getBitAtPosition (&list->optmask, _SO_MASK) == BIT_ON) list->output_mode = OUTMODE_OVERVIEW; if (getBitAtPosition (&list->optmask, _RAW_MASK) == BIT_ON) list->output_mode = OUTMODE_RAW; if (getBitAtPosition (&list->optmask, _Q_MASK) == BIT_ON) list->output_mode = OUTMODE_QUIET; if (getBitAtPosition (&list->optmask, _H_MASK) == BIT_OFF && getBitAtPosition (&list->optmask, _V_MASK) == BIT_OFF && argc - optind != 2) { print_help (PACKAGE); return -1; } else if ( (rv = is_numfmt_valid(&list->nf1)) == INVALID_NUMFMT ) { fprintf (stderr, _("The numeric format specified for the first file is illegal,\n")); fprintf (stderr, _("the following symbols should be all different\nwhile two or more of them are actually equal:\n")); fprintf (stderr, _("\nDecimal point = `%c\'\n"), list->nf1.dp); fprintf (stderr, _("Thousands separator = `%c\'\n"), list->nf1.thsep); fprintf (stderr, _("Leading positive sign = `%c\'\n"), list->nf1.pos_sign); fprintf (stderr, _("Leading negative sign = `%c\'\n"), list->nf1.neg_sign); fprintf (stderr, _("Prefix for decimal exponent = `%c\'\n"), list->nf1.ech); fprintf (stderr, _("Symbol used to denote the imaginary unit = `%c\'\n\n"), list->nf1.iu); return -1; } else if ( rv == INVALID_CURRENCY ) { fprintf (stderr, _("The numeric format specified for the first file is illegal:\n")); fprintf (stderr, _("the name of the currency may not contain digits,\n")); fprintf (stderr, _("the symbol for the leading positive sign (`%c\'),\n"), list->nf1.pos_sign); fprintf (stderr, _("the symbol for the leading negative sign (`%c\'),\n"), list->nf1.neg_sign); fprintf (stderr, _("the decimal point (`%c\'), or the thousands separator (`%c\')\n"), list->nf1.dp, list->nf1.thsep); return -1; } else if ( (rv = is_numfmt_valid(&list->nf2)) == INVALID_NUMFMT ) { fprintf (stderr, _("The numeric format specified for the second file is illegal,\n")); fprintf (stderr, _("the following symbols should be all different\nwhile two or more of them are actually equal:\n")); fprintf (stderr, _("\nDecimal point = `%c\'\n"), list->nf2.dp); fprintf (stderr, _("Thousands separator = `%c\'\n"), list->nf2.thsep); fprintf (stderr, _("Leading positive sign = `%c\'\n"), list->nf2.pos_sign); fprintf (stderr, _("Leading negative sign = `%c\'\n"), list->nf2.neg_sign); fprintf (stderr, _("Prefix for decimal exponent = `%c\'\n"), list->nf2.ech); fprintf (stderr, _("Symbol used to denote the imaginary unit = `%c\'\n\n"), list->nf2.iu); return -1; } else if ( rv == INVALID_CURRENCY ) { fprintf (stderr, _("The numeric format specified for the second file is illegal:\n")); fprintf (stderr, _("the name of the currency may not contain digits,\n")); fprintf (stderr, _("the symbol for the leading positive sign (`%c\'),\n"), list->nf2.pos_sign); fprintf (stderr, _("the symbol for the leading negative sign (`%c\'),\n"), list->nf2.neg_sign); fprintf (stderr, _("the decimal point (`%c\'), or the thousands separator (`%c\')\n"), list->nf2.dp, list->nf2.thsep); return -1; } else { if(getBitAtPosition (&list->optmask, _H_MASK) == BIT_OFF && getBitAtPosition (&list->optmask, _V_MASK) == BIT_OFF) { list->file1 = (const char*) argv[optind]; list->file2 = (const char*) argv[optind+1]; } return 0; } } numdiff-5.9.0/config.h.in0000444000175000017500000002443713054341114014530 0ustar paologpaolog/* config.h.in. Generated from configure.ac by autoheader. */ /* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ #undef CRAY_STACKSEG_END /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the `bcopy' function. */ #undef HAVE_BCOPY /* Define to 1 if you have the `btowc' function. */ #undef HAVE_BTOWC /* Define to 1 if you have the `bzero' function. */ #undef HAVE_BZERO /* Define to 1 if you have the `clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME /* Define to 1 if C supports variable-length arrays. */ #undef HAVE_C_VARARRAYS /* Define to 1 if you have the declaration of `clearerr_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_CLEARERR_UNLOCKED /* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FEOF_UNLOCKED /* Define to 1 if you have the declaration of `ferror_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FERROR_UNLOCKED /* Define to 1 if you have the declaration of `fflush_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FFLUSH_UNLOCKED /* Define to 1 if you have the declaration of `fgets_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FGETS_UNLOCKED /* Define to 1 if you have the declaration of `fputc_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FPUTC_UNLOCKED /* Define to 1 if you have the declaration of `fputs_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FPUTS_UNLOCKED /* Define to 1 if you have the declaration of `fread_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FREAD_UNLOCKED /* Define to 1 if you have the declaration of `fwrite_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FWRITE_UNLOCKED /* Define to 1 if you have the declaration of `getchar_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_GETCHAR_UNLOCKED /* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_GETC_UNLOCKED /* Define to 1 if you have the declaration of `putchar_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_PUTCHAR_UNLOCKED /* Define to 1 if you have the declaration of `putc_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_PUTC_UNLOCKED /* Define to 1 if you have the declaration of `strerror', and to 0 if you don't. */ #undef HAVE_DECL_STRERROR /* Define to 1 if you have the declaration of `strerror_r', and to 0 if you don't. */ #undef HAVE_DECL_STRERROR_R /* 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 `fork' function. */ #undef HAVE_FORK /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `isascii' function. */ #undef HAVE_ISASCII /* Define to 1 if you have the `gmp' library (-lgmp). */ #undef HAVE_LIBGMP /* Define to 1 if you have the `localeconv' function. */ #undef HAVE_LOCALECONV /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the DOS-style `setmode' function. */ #undef HAVE_SETMODE_DOS /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_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 `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strerror_r' function. */ #undef HAVE_STRERROR_R /* Define to 1 if you have the `strftime' function. */ #undef HAVE_STRFTIME /* 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 `st_blksize' is member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_BLKSIZE /* Define to 1 if `st_rdev' is member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_RDEV /* Define to 1 if your `struct stat' has `st_blksize'. Deprecated, use `HAVE_STRUCT_STAT_ST_BLKSIZE' instead. */ #undef HAVE_ST_BLKSIZE /* Define to 1 if your `struct stat' has `st_rdev'. Deprecated, use `HAVE_STRUCT_STAT_ST_RDEV' instead. */ #undef HAVE_ST_RDEV /* 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. */ #undef HAVE_SYS_FILE_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 that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the header file. */ #undef HAVE_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if you have the `waitpid' function. */ #undef HAVE_WAITPID /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define to 1 if you have the header file. */ #undef HAVE_WCTYPE_H /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* 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 version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if the `S_IS*' macros in do not work properly. */ #undef STAT_MACROS_BROKEN /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if strerror_r returns char *. */ #undef STRERROR_R_CHAR_P /* Define to be the nanoseconds member of struct stat's st_mtim, if it exists. */ #undef ST_MTIM_NSEC /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Define to 1 if you want getc etc. to use unlocked I/O if available. Unlocked I/O can improve performance in unithreaded apps, but it is not safe for multithreaded apps. */ #undef USE_UNLOCKED_IO /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to `int' if does not define. */ #undef pid_t /* Define to `int' if does not define. */ #undef ptrdiff_t /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to `int' if does not define. */ #undef ssize_t /* Define as `fork' if `vfork' does not work. */ #undef vfork /* Version + Release number */ #define VERSION "5.9.0" /* Number of decimal digits used in displaying the values */ /* for absolute and relative error. */ #define DEF_LIM 10 /* Size of the input buffer (used to read from file) */ #define BUFF_SIZE 1024 /* Size of the mask of fields. FIELDMASK_SIZE * 8 gives the */ /* largest index of field which can be passed to the -F option */ /* on the command line. */ #define FIELDMASK_SIZE 4096 #define HAVE_LONG_LONG 1 /* Line separator (output) */ #define LINE_SEP "----------------" /* End-of-File indicator */ #define EOF_INDICATOR "<<*>>" /* Hyphenation character */ #define HYPHEN '-' numdiff-5.9.0/AUTHORS0000644000175000017500000000111713054341114013545 0ustar paologpaologNumdiff Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi (Ivano Primi is also the author of the program) Note: Numdiff includes source code from * GNU BC 1.06, Copyright (C) 1991, 1992, 1993, 1994, 1997, 2000 Free Software Foundation, Inc. * GNU C Library, Copyright (C) 1989-1994,1996-1999,2001,2003,2004 Free Software Foundation, Inc. and source code from GNU DIFF, Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002 Free Software Foundation, Inc. numdiff-5.9.0/new.c0000444000175000017500000002171513054341114013436 0ustar paologpaolog/* Numdiff - compare putatively similar files, ignoring small numeric differences Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ivano Primi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include /* for isspace() */ #include #include"number.h" #include"numdiff.h" #ifdef _DMALLOC_ #include /* Useful only for debugging */ #endif #ifdef BC_A2NUM_DEBUG #define move_ahead(ptr) out_char_stderr(*ptr), ptr++ #define set(endptr,str) *endptr = (char*)str, fprintf (stderr, "tail: \"%s\"\n", *endptr) #else #define move_ahead(ptr) ptr++ #define set(endptr,str) *endptr = (char*)str #endif static bc_num bc_10_raised_to (long expn, int add_d_dig) { bc_num pw; if (expn >= 0) { pw = bc_new_num (1 + expn, 0); pw->n_value[0] = 1; } else { pw = bc_new_num (1, -expn + add_d_dig); pw->n_value[-expn] = 1; } #ifdef BC_10_DEBUG fprintf (stderr, "10^%ld = ", expn); pn_stderr (pw); #endif return pw; } static int bc_a2num (bc_num *num, const char *str, char **endptr, int scale, const struct numfmt* pnf) { char *ptr, *nptr; int digits, strscale; long expn; char zero_int; size_t length; #ifdef BC_A2NUM_DEBUG fprintf (stderr, "\n\"%s\"\n", str); #endif /* Check for valid number and count digits. */ ptr = (char*)str; digits = 0; strscale = 0; zero_int = FALSE; length = strlen(pnf->currency); if ( (*ptr == pnf->pos_sign) || (*ptr == pnf->neg_sign) ) move_ahead(ptr); /* Sign */ if ( length > 0 && strncmp (ptr, pnf->currency, length) == 0 ) ptr += length; /* Skip the currency name, if specified */ if (pnf->grouping > 0) { while ( (is_digit((int)*ptr)) || *ptr == pnf->thsep ) { int first_sep = 1; if (*ptr == pnf->thsep) { unsigned i; char* ptr2; if ((first_sep)) { /* We have to check that before the separator there is */ /* at least one digit but no more than 'pnf->grouping' */ for (i=0, ptr2 = ptr; ptr2 > str && (is_digit ((int)*(ptr2-1))); i++, ptr2--); if (i == 0 || i > pnf->grouping) { if ((endptr)) set(endptr,str); return -1; } first_sep = 0; } /* We have to check that after the separator */ /* there are exactly 'pnf->grouping' digits */ for (i = 0, ptr2 = ptr + 1; (is_digit((int)*ptr2)); i++, ptr2++); if (i != pnf->grouping) { if ((endptr)) set(endptr,str); return -1; } ptr++; } else /* We have just found a new digit */ move_ahead(ptr), digits++; } } else /* pnf->grouping == 0 */ { while ( (is_digit((int)*ptr)) ) move_ahead(ptr), digits++; /* digits */ } /* OLD CODE */ /* while ( (is_digit((int)*ptr)) ) */ /* ptr++, digits++; */ if (*ptr == pnf->dp) move_ahead(ptr); /* decimal point */ while (is_digit((int)*ptr)) move_ahead(ptr), strscale++; /* digits */ if (digits+strscale == 0) { if ((endptr)) set(endptr,str); *num = bc_copy_num (_zero_); return -1; } if (TOLOWER(*ptr) == TOLOWER(pnf->ech) && !is_space (*(ptr+1))) { char *tail; expn = strtol (ptr + 1, &tail, 10); if (expn < MIN_EXPN && tail != ptr + 1) { fprintf (stderr, _("%s: a number with a too small exponent has been found,\nnamely \"%s\".\n"), PACKAGE, str); fprintf (stderr, _("Exponents smaller than %ld are not accepted,\n"), MIN_EXPN); fprintf (stderr, _("the execution of the program ends now\n")); exit (EXIT_TROUBLE); } if (expn > MAX_EXPN && tail != ptr + 1) { fprintf (stderr, _("%s: a number with a too large exponent has been found,\nnamely \"%s\".\n"), PACKAGE, str); fprintf (stderr, _("Exponents larger than %ld are not accepted,\n"), MAX_EXPN); fprintf (stderr, _("the execution of the program ends now\n")); exit (EXIT_TROUBLE); } if ((endptr)) *endptr = tail != ptr + 1 ? tail : ptr; } else { expn = 0; if ((endptr)) *endptr = ptr; } #ifdef BC_A2NUM_DEBUG fprintf (stderr, "%c%ld\n", pnf->ech, expn); #endif /* Adjust numbers and allocate storage and initialize fields. */ strscale = MIN(strscale, scale); if (digits == 0) { zero_int = TRUE; digits = 1; } *num = bc_new_num (digits, strscale); /* Build the whole number. */ ptr = (char*)str; if (*ptr == pnf->neg_sign) { (*num)->n_sign = MINUS; ptr++; } else { (*num)->n_sign = PLUS; if (*ptr == pnf->pos_sign) ptr++; } if ( length > 0 && strncmp (ptr, pnf->currency, length) == 0 ) ptr += length; /* Skip the currency name, if specified */ nptr = (*num)->n_value; if ((zero_int)) { *nptr++ = 0; digits = 0; } for (; digits > 0; ptr++) { /* We have to take into account the presence of the thousands separator ! */ if (*ptr != pnf->thsep) { /* *ptr is a digit! */ *nptr++ = CH_VAL(*ptr); digits--; } } /* OLD CODE (to build the integer part) for (;digits > 0; digits--) *nptr++ = CH_VAL(*ptr++); */ /* Build the fractional part. */ if (strscale > 0) { ptr++; /* skip the decimal point! */ for (;strscale > 0; strscale--) *nptr++ = CH_VAL(*ptr++); } /* Take into account the exponent */ if((expn)) { bc_num Factor, Prod; bc_init_num (&Prod); Factor = expn > 0 ? bc_10_raised_to (expn, 0) : bc_10_raised_to (expn, scale); bc_multiply (*num, Factor, &Prod, strscale); *num = bc_copy_num (Prod); bc_free_num (&Factor); bc_free_num (&Prod); } #ifdef BC_A2NUM_DEBUG pn_stderr (*num); if((endptr)) fprintf (stderr, "tail: \"%s\"\n", *endptr); #endif return 0; } #define DIM 50 static void bc_print_num (bc_num num, void (* out_char)(int), int prec) { /* The negative sign if needed. */ if (num->n_sign == MINUS) (*out_char) ('-'); /* Output the number. */ if (num->n_value[0] == 10) { (*out_char) ('I'); (*out_char) ('n'); (*out_char) ('f'); } else if (bc_is_zero (num)) { (*out_char) ('0'); (*out_char) ('.'); for (; prec > 0; prec--) (*out_char) ('0'); } else { char *nptr; int index, ndig; signed char dig_list[DIM], *buffer, *p; long expn; assert ((buffer = calloc (prec + 1, sizeof (signed char)))); nptr = num->n_value; #ifdef __DEBUG__ pv ("nptr", nptr, num->n_len + num->n_scale); (*out_char)('\n'); #endif for (expn = num->n_len; expn > 0 && !*nptr; nptr++, expn--); /* Now expn == number of non-null digits */ /* in the integer part of the number */ if (expn == 0) { /* Now nptr points to the first digit */ /* of the fractional part. */ for (index = num->n_scale, expn = -1; !*nptr; index--, expn--, nptr++); /* Now expn is the exponent of the number */ /* in base 10. */ } else { expn--; /* Now expn is the exponent of the number */ /* in base 10. */ for (index = num->n_len + num->n_scale, nptr = num->n_value; !*nptr; index--, nptr++); } /* First we print the mantissa */ for (p = buffer, ndig = prec + 1; ndig > 0 && index > 0; ndig--, index--, p++, nptr++) *p = *nptr; if (ndig == 0 && index > 0) { /* Rounding */ if (*nptr >= 5) { for (--p; p > buffer && *p == 9; *p = 0, p--); if (p == buffer) { if (*p == 9) { *p = 1; expn++; } else (*p)++; } else (*p)++; } } (*out_char)(BCD_CHAR(*buffer)); (*out_char)('.'); for (index = 1; index <= prec; index++) (*out_char)(BCD_CHAR(buffer[index])); free((void*)buffer); /* Now it is the moment to print the exponent... */ (*out_char)('e'); if (expn < 0) { (*out_char) ('-'); expn = -expn; } else (*out_char) ('+'); for (index = 0; index < DIM; dig_list[index] = -1, index++); index = 0; do { dig_list[index] = expn % 10; expn /= 10; index++; } while ((expn)); for (index = 0; dig_list[index] >= 0; index++); for (--index; index >= 0; index--) (*out_char)(BCD_CHAR(dig_list[index])); /* .. done ! */ } /* End of num != 0 */ } numdiff-5.9.0/system.h0000444000175000017500000002515013054341114014173 0ustar paologpaolog/* System dependent declarations. Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU DIFF. GNU DIFF is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU DIFF is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include /* Don't bother to support K&R C compilers any more; it's not worth the trouble. These macros prevent some library modules from being compiled in K&R C mode. */ #define PARAMS(Args) Args #define PROTOTYPES 1 /* Define `__attribute__' and `volatile' first so that they're used consistently in all system includes. */ #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 6) || __STRICT_ANSI__ # define __attribute__(x) #endif #if defined const && !defined volatile # define volatile #endif /* Verify a requirement at compile-time (unlike assert, which is runtime). */ #define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; } /* Determine whether an integer type is signed, and its bounds. This code assumes two's (or one's!) complement with no holes. */ /* The extra casts work around common compiler bugs, e.g. Cray C 5.0.3.0 when t == time_t. */ #ifndef TYPE_SIGNED # define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) #endif #ifndef TYPE_MINIMUM # define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \ ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) \ : (t) 0)) #endif #ifndef TYPE_MAXIMUM # define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t))) #endif #include #include #if STAT_MACROS_BROKEN # undef S_ISBLK # undef S_ISCHR # undef S_ISDIR # undef S_ISFIFO # undef S_ISREG # undef S_ISSOCK #endif #ifndef S_ISDIR # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) #endif #ifndef S_ISREG # define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) #endif #if !defined S_ISBLK && defined S_IFBLK # define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) #endif #if !defined S_ISCHR && defined S_IFCHR # define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) #endif #if !defined S_ISFIFO && defined S_IFFIFO # define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFFIFO) #endif #if !defined S_ISSOCK && defined S_IFSOCK # define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) #endif #ifndef S_IXUSR # define S_IXUSR 0100 #endif #ifndef S_IXGRP # define S_IXGRP 0010 #endif #ifndef S_IXOTH # define S_IXOTH 0001 #endif #if HAVE_UNISTD_H # include #endif #ifndef SEEK_SET # define SEEK_SET 0 #endif #ifndef SEEK_CUR # define SEEK_CUR 1 #endif #ifndef STDIN_FILENO # define STDIN_FILENO 0 #endif #ifndef STDOUT_FILENO # define STDOUT_FILENO 1 #endif #ifndef STDERR_FILENO # define STDERR_FILENO 2 #endif #if HAVE_TIME_H # include #else # include #endif #if HAVE_FCNTL_H # include #else # if HAVE_SYS_FILE_H # include # endif #endif /* Commented out by Ivano Primi, 03.14.2009 */ /* #if !HAVE_DUP2 */ /* # define dup2(f, t) (close (t), fcntl (f, F_DUPFD, t)) */ /* #endif */ #ifndef O_RDONLY # define O_RDONLY 0 #endif #ifndef O_RDWR # define O_RDWR 2 #endif #ifndef S_IRUSR # define S_IRUSR 0400 #endif #ifndef S_IWUSR # define S_IWUSR 0200 #endif #if HAVE_SYS_WAIT_H # include #endif #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif #ifndef STAT_BLOCKSIZE # if HAVE_STRUCT_STAT_ST_BLKSIZE # define STAT_BLOCKSIZE(s) ((s).st_blksize) # else # define STAT_BLOCKSIZE(s) (8 * 1024) # endif #endif #if HAVE_DIRENT_H # include # define NAMLEN(dirent) strlen ((dirent)->d_name) #else # define dirent direct # define NAMLEN(dirent) ((dirent)->d_namlen) # if HAVE_SYS_NDIR_H # include # endif # if HAVE_SYS_DIR_H # include # endif # if HAVE_NDIR_H # include # endif #endif #if HAVE_STDLIB_H # include #else # ifndef getenv char *getenv (); # endif #endif #ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 #endif #if !EXIT_FAILURE # undef EXIT_FAILURE /* Sony NEWS-OS 4.0C defines EXIT_FAILURE to 0. */ # define EXIT_FAILURE 1 #endif #define EXIT_TROUBLE -1 #include #ifndef SSIZE_MAX # define SSIZE_MAX TYPE_MAXIMUM (ssize_t) #endif #if HAVE_INTTYPES_H # include #endif #ifndef PTRDIFF_MAX # define PTRDIFF_MAX TYPE_MAXIMUM (ptrdiff_t) #endif #ifndef SIZE_MAX # define SIZE_MAX TYPE_MAXIMUM (size_t) #endif #ifndef UINTMAX_MAX # define UINTMAX_MAX TYPE_MAXIMUM (uintmax_t) #endif /* Commented out by Ivano Primi, 03.14.2009 */ /* #if ! HAVE_STRTOUMAX && ! defined strtoumax */ /* uintmax_t strtoumax (char const *, char **, int); */ /* #endif */ #include #if STDC_HEADERS || HAVE_STRING_H # include #else # if !HAVE_STRCHR # define strchr index # define strrchr rindex # endif char *strchr (), *strrchr (); # if !HAVE_MEMCHR # define memcmp(s1, s2, n) bcmp (s1, s2, n) # define memcpy(d, s, n) bcopy (s, d, n) void *memchr (); # endif #endif #if HAVE_LOCALE_H # include #else # define setlocale(category, locale) #endif /* Commented out by Ivano Primi, 03.23.2008 #include #define _(msgid) gettext (msgid) #define N_(msgid) msgid */ /* Added by Ivano Primi, 03.23.2008 */ /* This code was part of the file "numdiff.h" */ /* I18N and L10N support */ #ifdef ENABLE_NLS #include #define _(String) gettext (String) #define gettext_noop(String) String #define N_(String) gettext_noop (String) #else #define _(String) (String) #define N_(String) String # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) #define textdomain(Domain) #define bindtextdomain(Package, Directory) #endif /* End added code */ #include /* CTYPE_DOMAIN (C) is nonzero if the unsigned char C can safely be given as an argument to macros like `isspace'. */ #if STDC_HEADERS # define CTYPE_DOMAIN(c) 1 #else # define CTYPE_DOMAIN(c) ((unsigned int) (c) <= 0177) #endif #define ISPRINT(c) (CTYPE_DOMAIN (c) && isprint (c)) #define ISSPACE(c) (CTYPE_DOMAIN (c) && isspace (c)) #if STDC_HEADERS # define TOLOWER(c) tolower (c) #else # ifndef _tolower # define _tolower(c) tolower (c) # endif # define TOLOWER(c) (CTYPE_DOMAIN (c) && isupper (c) ? _tolower (c) : (c)) #endif /* ISDIGIT differs from isdigit, as follows: - Its arg may be any int or unsigned int; it need not be an unsigned char. - It's guaranteed to evaluate its argument exactly once. - It's typically faster. POSIX 1003.1-2001 says that only '0' through '9' are digits. Prefer ISDIGIT to isdigit unless it's important to use the locale's definition of `digit' even when the host does not conform to POSIX. */ #define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9) #include #if !STDC_HEADERS extern int errno; #endif #include #ifndef SA_RESTART # ifdef SA_INTERRUPT /* e.g. SunOS 4.1.x */ # define SA_RESTART SA_INTERRUPT # else # define SA_RESTART 0 # endif #endif #if !defined SIGCHLD && defined SIGCLD # define SIGCHLD SIGCLD #endif #undef MIN #undef MAX #define MIN(a, b) ((a) <= (b) ? (a) : (b)) #define MAX(a, b) ((a) >= (b) ? (a) : (b)) #if HAVE_STDBOOL_H # include #else # define bool unsigned char #endif #if HAVE_VFORK_H # include #endif #if ! HAVE_WORKING_VFORK # define vfork fork #endif /* Type used for fast comparison of several bytes at a time. */ #ifndef word # define word uintmax_t #endif /* The integer type of a line number. Since files are read into main memory, ptrdiff_t should be wide enough. */ typedef ptrdiff_t lin; #define LIN_MAX PTRDIFF_MAX verify (lin_is_signed, TYPE_SIGNED (lin)); verify (lin_is_wide_enough, sizeof (ptrdiff_t) <= sizeof (lin)); verify (lin_is_printable_as_long, sizeof (lin) <= sizeof (long)); /* This section contains POSIX-compliant defaults for macros that are meant to be overridden by hand in config.h as needed. */ #ifndef file_name_cmp # define file_name_cmp strcmp #endif #ifndef initialize_main # define initialize_main(argcp, argvp) #endif #ifndef NULL_DEVICE # define NULL_DEVICE "/dev/null" #endif /* Do struct stat *S, *T describe the same special file? */ #ifndef same_special_file # if HAVE_ST_RDEV && defined S_ISBLK && defined S_ISCHR # define same_special_file(s, t) \ (((S_ISBLK ((s)->st_mode) && S_ISBLK ((t)->st_mode)) \ || (S_ISCHR ((s)->st_mode) && S_ISCHR ((t)->st_mode))) \ && (s)->st_rdev == (t)->st_rdev) # else # define same_special_file(s, t) 0 # endif #endif /* Do struct stat *S, *T describe the same file? Answer -1 if unknown. */ #ifndef same_file # define same_file(s, t) \ ((((s)->st_ino == (t)->st_ino) && ((s)->st_dev == (t)->st_dev)) \ || same_special_file (s, t)) #endif /* Do struct stat *S, *T have the same file attributes? POSIX says that two files are identical if st_ino and st_dev are the same, but many filesystems incorrectly assign the same (device, inode) pair to two distinct files, including: - GNU/Linux NFS servers that export all local filesystems as a single NFS filesystem, if a local device number (st_dev) exceeds 255, or if a local inode number (st_ino) exceeds 16777215. - Network Appliance NFS servers in snapshot directories; see Network Appliance bug #195. - ClearCase MVFS; see bug id ATRia04618. Check whether two files that purport to be the same have the same attributes, to work around instances of this common bug. Do not inspect all attributes, only attributes useful in checking for this bug. It's possible for two distinct files on a buggy filesystem to have the same attributes, but it's not worth slowing down all implementations (or complicating the configuration) to cater to these rare cases in buggy implementations. */ #ifndef same_file_attributes # define same_file_attributes(s, t) \ ((s)->st_mode == (t)->st_mode \ && (s)->st_nlink == (t)->st_nlink \ && (s)->st_uid == (t)->st_uid \ && (s)->st_gid == (t)->st_gid \ && (s)->st_size == (t)->st_size \ && (s)->st_mtime == (t)->st_mtime \ && (s)->st_ctime == (t)->st_ctime) #endif